summaryrefslogtreecommitdiffstats
path: root/libc
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2010-03-22 15:55:09 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2010-03-22 15:55:09 -0700
commit377d4c979dee3dcb5929e8f7a68a53c2407259ab (patch)
tree1783fe0272f1437faabfe8365e615696eb8d374c /libc
parent709a898de82128c065381e258e8e71f0a55df976 (diff)
parent1825fb5d5f214849e39d95660795a0d3633f8eeb (diff)
downloadbionic-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.mk1
-rw-r--r--libc/arch-x86/bionic/syscall.S52
-rw-r--r--libc/bionic/malloc_debug_leak.c5
-rw-r--r--libc/bionic/pthread.c9
-rw-r--r--libc/bionic/pututline.c2
-rw-r--r--libc/bionic/ssp.c4
-rw-r--r--libc/include/dlfcn.h12
-rw-r--r--libc/string/strcasecmp.c4
-rw-r--r--libc/string/strchr.c2
-rwxr-xr-xlibc/string/strcoll.c2
-rw-r--r--libc/string/strlcat.c4
-rw-r--r--libc/string/strlcpy.c2
-rw-r--r--libc/string/strncat.c2
-rw-r--r--libc/string/strncmp.c3
-rw-r--r--libc/string/strncpy.c4
-rw-r--r--libc/string/strpbrk.c2
-rw-r--r--libc/string/strrchr.c4
-rw-r--r--libc/string/strsep.c2
-rw-r--r--libc/string/strstr.c2
-rwxr-xr-xlibc/string/strxfrm.c2
-rw-r--r--libc/unistd/pread.c4
-rw-r--r--libc/unistd/pwrite.c4
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);
}