diff options
Diffstat (limited to 'tools/include/nolibc')
| -rw-r--r-- | tools/include/nolibc/stdlib.h | 2 | ||||
| -rw-r--r-- | tools/include/nolibc/string.h | 46 | ||||
| -rw-r--r-- | tools/include/nolibc/sys.h | 27 | 
3 files changed, 54 insertions, 21 deletions
diff --git a/tools/include/nolibc/stdlib.h b/tools/include/nolibc/stdlib.h index bacfd35c5156..5be9d3c7435a 100644 --- a/tools/include/nolibc/stdlib.h +++ b/tools/include/nolibc/stdlib.h @@ -185,7 +185,7 @@ void *realloc(void *old_ptr, size_t new_size)  	if (__builtin_expect(!ret, 0))  		return NULL; -	memcpy(ret, heap->user_p, heap->len); +	memcpy(ret, heap->user_p, user_p_len);  	munmap(heap, heap->len);  	return ret;  } diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h index a01c69dd495f..f9ab28421e6d 100644 --- a/tools/include/nolibc/string.h +++ b/tools/include/nolibc/string.h @@ -123,7 +123,7 @@ char *strcpy(char *dst, const char *src)   * thus itself, hence the asm() statement below that's meant to disable this   * confusing practice.   */ -static __attribute__((unused)) +__attribute__((weak,unused,section(".text.nolibc_strlen")))  size_t strlen(const char *str)  {  	size_t len; @@ -187,22 +187,26 @@ char *strndup(const char *str, size_t maxlen)  static __attribute__((unused))  size_t strlcat(char *dst, const char *src, size_t size)  { -	size_t len; -	char c; - -	for (len = 0; dst[len];	len++) -		; - -	for (;;) { -		c = *src; -		if (len < size) -			dst[len] = c; -		if (!c) +	size_t len = strnlen(dst, size); + +	/* +	 * We want len < size-1. But as size is unsigned and can wrap +	 * around, we use len + 1 instead. +	 */ +	while (len + 1 < size) { +		dst[len] = *src; +		if (*src == '\0')  			break;  		len++;  		src++;  	} +	if (len < size) +		dst[len] = '\0'; + +	while (*src++) +		len++; +  	return len;  } @@ -210,16 +214,18 @@ static __attribute__((unused))  size_t strlcpy(char *dst, const char *src, size_t size)  {  	size_t len; -	char c; -	for (len = 0;;) { -		c = src[len]; -		if (len < size) -			dst[len] = c; -		if (!c) -			break; -		len++; +	for (len = 0; len < size; len++) { +		dst[len] = src[len]; +		if (!dst[len]) +			return len;  	} +	if (size) +		dst[size-1] = '\0'; + +	while (src[len]) +		len++; +  	return len;  } diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index dda9dffd1d74..7b82bc3cf107 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -22,6 +22,7 @@  #include <linux/stat.h>  /* for statx() */  #include <linux/prctl.h>  #include <linux/resource.h> +#include <linux/utsname.h>  #include "arch.h"  #include "errno.h" @@ -1140,6 +1141,32 @@ int umount2(const char *path, int flags)  /* + * int uname(struct utsname *buf); + */ + +struct utsname { +	char sysname[65]; +	char nodename[65]; +	char release[65]; +	char version[65]; +	char machine[65]; +	char domainname[65]; +}; + +static __attribute__((unused)) +int sys_uname(struct utsname *buf) +{ +	return my_syscall1(__NR_uname, buf); +} + +static __attribute__((unused)) +int uname(struct utsname *buf) +{ +	return __sysret(sys_uname(buf)); +} + + +/*   * int unlink(const char *path);   */  |