Implemented getcwd sys call, along with a new helper function that wr… (#483)

* Implemented getcwd sys call, along with a new helper function that writes a NULL terminated string to memory.

The reason for this commit is that the sys call was not implemented.

* Fixed logging string for sys_getcwd imp

* Removed semicolon in sys_getcwd function

* Fixed logging string for sys_getcwd imp. The problem was that size is unsigned and the incorrect format symbol was used

* Fixed the following:
1) Included the string param in the doc of the write_string function.
2) Added less verbose code to append a NULL to a string in the write_string function
3) Removed the assert to check if the written string to memory matches with one that is read at a given address in the sys_getcwd function
4) Fixed bug in the return values returned by sys_getcwd

* Fixed error logs in the getcwd function.

* Fixed return values of sys_getcwd function.

* Fixed string format symbol in sys_getcwd function.

* Removed dir exists check from the sys_getcwd function.

* Arranged memory block check in the sys_getcwd function.

* Removed new line after write_string function.

(Thank you @johnfxgalea!)
This commit is contained in:
John F.X. Galea 2017-09-07 21:30:55 +01:00 committed by Yan
parent d83fa737a7
commit 60c6813a80
2 changed files with 43 additions and 0 deletions

View File

@ -552,6 +552,21 @@ class Cpu(Eventful):
result.append(Operators.CHR(self.read_int(where + i, 8)))
return result
def write_string(self, where, string, max_length=None):
'''
Writes a string to memory, appending a NULL-terminator at the end.
:param int where: Address to write the string to
:param str string: The string to write to memory
:param int max_length:
The size in bytes to cap the string at, or None [default] for no
limit. This includes the NULL terminator.
'''
if max_length is not None:
string = string[:max_length-1]
self.write_bytes(where, string + '\x00')
def read_string(self, where, max_length=None):
'''
Read a NUL-terminated concrete buffer from memory.

View File

@ -1029,6 +1029,34 @@ class Linux(Platform):
except OSError as e:
return e.errno
def sys_getcwd(self, buf, size):
'''
getcwd - Get the current working directory
:param int buf: Pointer to dest array
:param size: size in bytes of the array pointed to by the buf
:return: buf (Success), or 0
'''
try:
current_dir = os.getcwd()
length = len(current_dir) + 1
if size > 0 and size < length:
logger.info("GETCWD: size is greater than 0, but is smaller than the length"
"of the path + 1. Returning ERANGE")
return -errno.ERANGE
if not self.current.memory.access_ok(slice(buf, buf+length), 'w'):
logger.info("GETCWD: buf within invalid memory. Returning EFAULT")
return -errno.EFAULT
self.current.write_string(buf, current_dir)
logger.debug("getcwd(0x%08x, %u) -> <%s> (Size %d)", buf, size, current_dir, length)
return length
except OSError as e:
return -e.errno
def sys_lseek(self, fd, offset, whence):
'''
lseek - reposition read/write file offset