diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2010-03-22 15:55:09 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2010-03-22 15:55:09 -0700 |
commit | 377d4c979dee3dcb5929e8f7a68a53c2407259ab (patch) | |
tree | 1783fe0272f1437faabfe8365e615696eb8d374c /libc | |
parent | 709a898de82128c065381e258e8e71f0a55df976 (diff) | |
parent | 1825fb5d5f214849e39d95660795a0d3633f8eeb (diff) | |
download | bionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.zip bionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.tar.gz bionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.tar.bz2 |
merge from open-source master
Change-Id: I70266ee8c520b216773f267e46c8273d2334c31d
Diffstat (limited to 'libc')
-rw-r--r-- | libc/Android.mk | 1 | ||||
-rw-r--r-- | libc/arch-x86/bionic/syscall.S | 52 | ||||
-rw-r--r-- | libc/bionic/malloc_debug_leak.c | 5 | ||||
-rw-r--r-- | libc/bionic/pthread.c | 9 | ||||
-rw-r--r-- | libc/bionic/pututline.c | 2 | ||||
-rw-r--r-- | libc/bionic/ssp.c | 4 | ||||
-rw-r--r-- | libc/include/dlfcn.h | 12 | ||||
-rw-r--r-- | libc/string/strcasecmp.c | 4 | ||||
-rw-r--r-- | libc/string/strchr.c | 2 | ||||
-rwxr-xr-x | libc/string/strcoll.c | 2 | ||||
-rw-r--r-- | libc/string/strlcat.c | 4 | ||||
-rw-r--r-- | libc/string/strlcpy.c | 2 | ||||
-rw-r--r-- | libc/string/strncat.c | 2 | ||||
-rw-r--r-- | libc/string/strncmp.c | 3 | ||||
-rw-r--r-- | libc/string/strncpy.c | 4 | ||||
-rw-r--r-- | libc/string/strpbrk.c | 2 | ||||
-rw-r--r-- | libc/string/strrchr.c | 4 | ||||
-rw-r--r-- | libc/string/strsep.c | 2 | ||||
-rw-r--r-- | libc/string/strstr.c | 2 | ||||
-rwxr-xr-x | libc/string/strxfrm.c | 2 | ||||
-rw-r--r-- | libc/unistd/pread.c | 4 | ||||
-rw-r--r-- | libc/unistd/pwrite.c | 4 |
22 files changed, 96 insertions, 32 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index a6f2c83..d2e5e1f 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -343,6 +343,7 @@ libc_common_src_files += \ arch-x86/bionic/setjmp.S \ arch-x86/bionic/_setjmp.S \ arch-x86/bionic/vfork.S \ + arch-x86/bionic/syscall.S \ arch-x86/string/bzero.S \ arch-x86/string/memset.S \ arch-x86/string/memcmp.S \ diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S new file mode 100644 index 0000000..71abe6b --- /dev/null +++ b/libc/arch-x86/bionic/syscall.S @@ -0,0 +1,52 @@ +/* + * Generic syscall call. + * Upon entry + * %eax: system call number + * %ebx: arg0 to system call + * %ecx: arg.. + * %edx: arg.. + * %esi: arg.. + * %edi: arg.. + * We push these (to save them) load them up with the + * values from the calling frame (not all will actually be valid) + * and make the syscall. + */ + +#include <sys/linux-syscalls.h> + + .text + .type syscall, @function + .globl syscall + .align 4 + +syscall: + push %eax + push %ebx + push %ecx + push %edx + push %esi + push %edi + mov 28(%esp),%eax + mov 32(%esp),%ebx + mov 36(%esp),%ecx + mov 40(%esp),%edx + mov 44(%esp),%esi + mov 48(%esp),%edi + + int $0x80 + + cmpl $-129, %eax + jb 1f + negl %eax + pushl %eax + call __set_errno + addl $4, %esp + orl $-1, %eax +1: + pop %edi + pop %esi + pop %edx + pop %ecx + pop %ebx + pop %eax + ret diff --git a/libc/bionic/malloc_debug_leak.c b/libc/bionic/malloc_debug_leak.c index e11606d..2ff8cee 100644 --- a/libc/bionic/malloc_debug_leak.c +++ b/libc/bionic/malloc_debug_leak.c @@ -430,8 +430,9 @@ void* chk_realloc(void* mem, size_t bytes) } if (new_buffer) { - size_t size = (bytes < old_bytes)?(bytes):(old_bytes); - memcpy(new_buffer, mem, size); + if (bytes > old_bytes) + bytes = old_bytes; + memcpy(new_buffer, mem, bytes); chk_free(mem); } diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c index 3294cea..6a2329f 100644 --- a/libc/bionic/pthread.c +++ b/libc/bionic/pthread.c @@ -601,13 +601,12 @@ int pthread_join(pthread_t thid, void ** ret_val) for (thread = gThreadList; thread != NULL; thread = thread->next) if (thread == (pthread_internal_t*)thid) - break; + goto FoundIt; - if (!thread) { - pthread_mutex_unlock(&gThreadListLock); - return ESRCH; - } + pthread_mutex_unlock(&gThreadListLock); + return ESRCH; +FoundIt: if (thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) { pthread_mutex_unlock(&gThreadListLock); return EINVAL; diff --git a/libc/bionic/pututline.c b/libc/bionic/pututline.c index 2449068..c8427f7 100644 --- a/libc/bionic/pututline.c +++ b/libc/bionic/pututline.c @@ -34,7 +34,7 @@ void pututline(struct utmp* utmp) { FILE* f; struct utmp u; - int i; + long i; if (!(f = fopen(_PATH_UTMP, "w+"))) return; diff --git a/libc/bionic/ssp.c b/libc/bionic/ssp.c index 20794f4..f83b2a4 100644 --- a/libc/bionic/ssp.c +++ b/libc/bionic/ssp.c @@ -76,9 +76,9 @@ void __stack_chk_fail(void) sigprocmask(SIG_BLOCK, &sigmask, NULL); /* Use /proc/self/exe link to obtain the program name for logging - * purposes. If it's not available, we set it to "unknown" */ + * purposes. If it's not available, we set it to "<unknown>" */ if ((count = readlink("/proc/self/exe", path, sizeof(path) - 1)) == -1) { - strlcpy(path, "unknown", sizeof(path)); + strlcpy(path, "<unknown>", sizeof(path)); } else { path[count] = '\0'; } diff --git a/libc/include/dlfcn.h b/libc/include/dlfcn.h index 9582796..f84d1d1 100644 --- a/libc/include/dlfcn.h +++ b/libc/include/dlfcn.h @@ -32,10 +32,22 @@ __BEGIN_DECLS +typedef struct { + const char *dli_fname; /* Pathname of shared object that + contains address */ + void *dli_fbase; /* Address at which shared object + is loaded */ + const char *dli_sname; /* Name of nearest symbol with address + lower than addr */ + void *dli_saddr; /* Exact address of symbol named + in dli_sname */ +} Dl_info; + extern void* dlopen(const char* filename, int flag); extern int dlclose(void* handle); extern const char* dlerror(void); extern void* dlsym(void* handle, const char* symbol); +extern int dladdr(void* addr, Dl_info *info); enum { RTLD_NOW = 0, diff --git a/libc/string/strcasecmp.c b/libc/string/strcasecmp.c index 12f3a09..2be0913 100644 --- a/libc/string/strcasecmp.c +++ b/libc/string/strcasecmp.c @@ -98,8 +98,8 @@ strncasecmp(const char *s1, const char *s2, size_t n) if (cm[*us1] != cm[*us2++]) return (cm[*us1] - cm[*--us2]); if (*us1++ == '\0') - break; + break; } while (--n != 0); - } + } return (0); } diff --git a/libc/string/strchr.c b/libc/string/strchr.c index e33694c..31ba4e2 100644 --- a/libc/string/strchr.c +++ b/libc/string/strchr.c @@ -38,6 +38,6 @@ strchr(const char *p, int ch) return((char *)p); if (!*p) return((char *)NULL); - } + } /* NOTREACHED */ } diff --git a/libc/string/strcoll.c b/libc/string/strcoll.c index 365cad5..e3b1ec3 100755 --- a/libc/string/strcoll.c +++ b/libc/string/strcoll.c @@ -36,5 +36,5 @@ int strcoll(const char *s1, const char *s2) { - return strcmp (s1, s2); + return strcmp(s1, s2); } diff --git a/libc/string/strlcat.c b/libc/string/strlcat.c index ad2215b..ceab094 100644 --- a/libc/string/strlcat.c +++ b/libc/string/strlcat.c @@ -46,9 +46,9 @@ strlcat(char *dst, const char *src, size_t siz) if (n != 1) { *d++ = *s; n--; - } + } s++; - } + } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */ diff --git a/libc/string/strlcpy.c b/libc/string/strlcpy.c index 38277eb..d32b659 100644 --- a/libc/string/strlcpy.c +++ b/libc/string/strlcpy.c @@ -37,7 +37,7 @@ strlcpy(char *dst, const char *src, size_t siz) if ((*d++ = *s++) == '\0') break; } - } + } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { diff --git a/libc/string/strncat.c b/libc/string/strncat.c index 1cb9405..c4df4f2 100644 --- a/libc/string/strncat.c +++ b/libc/string/strncat.c @@ -52,6 +52,6 @@ strncat(char *dst, const char *src, size_t n) d++; } while (--n != 0); *d = 0; - } + } return (dst); } diff --git a/libc/string/strncmp.c b/libc/string/strncmp.c index 9da41ab..1768808 100644 --- a/libc/string/strncmp.c +++ b/libc/string/strncmp.c @@ -38,14 +38,13 @@ int strncmp(const char *s1, const char *s2, size_t n) { - if (n == 0) return (0); do { if (*s1 != *s2++) return (*(unsigned char *)s1 - *(unsigned char *)--s2); if (*s1++ == 0) - break; + break; } while (--n != 0); return (0); } diff --git a/libc/string/strncpy.c b/libc/string/strncpy.c index b91091b..4426cbe 100644 --- a/libc/string/strncpy.c +++ b/libc/string/strncpy.c @@ -54,8 +54,8 @@ strncpy(char *dst, const char *src, size_t n) /* NUL pad the remaining n-1 bytes */ while (--n != 0) *d++ = 0; - break; - } + break; + } } while (--n != 0); } return (dst); diff --git a/libc/string/strpbrk.c b/libc/string/strpbrk.c index 6ba3796..cd3b71c 100644 --- a/libc/string/strpbrk.c +++ b/libc/string/strpbrk.c @@ -38,7 +38,7 @@ strpbrk(const char *s1, const char *s2) { const char *scanp; int c, sc; - + while ((c = *s1++) != 0) { for (scanp = s2; (sc = *scanp++) != 0;) if (sc == c) diff --git a/libc/string/strrchr.c b/libc/string/strrchr.c index 2800781..4918f82 100644 --- a/libc/string/strrchr.c +++ b/libc/string/strrchr.c @@ -34,12 +34,12 @@ char * strrchr(const char *p, int ch) { char *save; - + for (save = NULL;; ++p) { if (*p == ch) save = (char *)p; if (!*p) return(save); - } + } /* NOTREACHED */ } diff --git a/libc/string/strsep.c b/libc/string/strsep.c index bcca681..c44bc5b 100644 --- a/libc/string/strsep.c +++ b/libc/string/strsep.c @@ -34,7 +34,7 @@ /* * Get next token from string *stringp, where tokens are possibly-empty - * strings separated by characters from delim. + * strings separated by characters from delim. * * Writes NULs into the string at *stringp to end tokens. * delim need not remain constant from call to call. diff --git a/libc/string/strstr.c b/libc/string/strstr.c index debe96c..95a865b 100644 --- a/libc/string/strstr.c +++ b/libc/string/strstr.c @@ -51,6 +51,6 @@ strstr(const char *s, const char *find) } while (sc != c); } while (strncmp(s, find, len) != 0); s--; - } + } return ((char *)s); } diff --git a/libc/string/strxfrm.c b/libc/string/strxfrm.c index f1843b5..3c4d707 100755 --- a/libc/string/strxfrm.c +++ b/libc/string/strxfrm.c @@ -29,7 +29,7 @@ /* * Transform string s2 to string s1 using the current locale so that - * strcmp of transformed strings yields the same result as strcoll. + * strcmp of transformed strings yields the same result as strcoll. * Since Bionic really does not support locales, we assume we always use * the C locale. * diff --git a/libc/unistd/pread.c b/libc/unistd/pread.c index d2f71f7..b55623e 100644 --- a/libc/unistd/pread.c +++ b/libc/unistd/pread.c @@ -25,10 +25,10 @@ #include <sys/types.h> #include <unistd.h> -extern int __pread64(int fd, void *buf, size_t nbytes, off_t lo, off_t hi); +extern int __pread64(int fd, void *buf, size_t nbytes, loff_t offset); ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset) { - return __pread64(fd, buf, nbytes, offset, 0); + return __pread64(fd, buf, nbytes, offset); } diff --git a/libc/unistd/pwrite.c b/libc/unistd/pwrite.c index 5adf40a..ea080d2 100644 --- a/libc/unistd/pwrite.c +++ b/libc/unistd/pwrite.c @@ -28,10 +28,10 @@ #include <sys/types.h> #include <unistd.h> -extern int __pwrite64(int fd, void *buf, size_t nbytes, off_t lo, off_t hi); +extern int __pwrite64(int fd, void *buf, size_t nbytes, loff_t offset); ssize_t pwrite(int fd, void *buf, size_t nbytes, off_t offset) { - return __pwrite64(fd, buf, nbytes, offset, 0); + return __pwrite64(fd, buf, nbytes, offset); } |