In that case, the same utoa() buffer was used twice, so it would show the
uid number in place of the gid.
---
 lib/lib.c |   12 +++++++-----
 lib/lib.h |    4 ++--
 toys/ls.c |    6 ++++--
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/lib/lib.c b/lib/lib.c
index e7dc45e..dc05c57 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -463,9 +463,10 @@ struct string_list *find_in_path(char *path, char 
*filename)
 // Convert unsigned int to ascii, writing into supplied buffer.  A truncated
 // result contains the first few digits of the result ala strncpy, and is
 // always null terminated (unless buflen is 0).
-void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
+char *utoa_to_buf(unsigned n, char *buf, unsigned buflen)
 {
        int i, out = 0;
+       char *p = buf;
 
        if (buflen) {
                for (i=1000000000; i; i/=10) {
@@ -474,22 +475,23 @@ void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
                        if ((res || out || i == 1) && --buflen>0) {
                                out++;
                                n -= res*i;
-                               *buf++ = '0' + res;
+                               *p++ = '0' + res;
                        }
                }
-               *buf = 0;
+               *p = 0;
        }
+       return buf;
 }
 
 // Convert signed integer to ascii, using utoa_to_buf()
-void itoa_to_buf(int n, char *buf, unsigned buflen)
+char *itoa_to_buf(int n, char *buf, unsigned buflen)
 {
        if (buflen && n<0) {
                n = -n;
                *buf++ = '-';
                buflen--;
        }
-       utoa_to_buf((unsigned)n, buf, buflen);
+       return utoa_to_buf((unsigned)n, buf, buflen);
 }
 
 // This static buffer is used by both utoa() and itoa(), calling either one a
diff --git a/lib/lib.h b/lib/lib.h
index 992d7d2..2ce74a3 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -123,8 +123,8 @@ void xchdir(char *path);
 void xmkpath(char *path, int mode);
 void xsetuid(uid_t uid);
 struct string_list *find_in_path(char *path, char *filename);
-void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
-void itoa_to_buf(int n, char *buf, unsigned buflen);
+char *utoa_to_buf(unsigned n, char *buf, unsigned buflen);
+char *itoa_to_buf(int n, char *buf, unsigned buflen);
 char *utoa(unsigned n);
 char *itoa(int n);
 long atolx(char *c);
diff --git a/toys/ls.c b/toys/ls.c
index 561b353..36b7e5a 100644
--- a/toys/ls.c
+++ b/toys/ls.c
@@ -120,14 +120,16 @@ static char endtype(struct stat *st)
 
 static char *getusername(uid_t uid)
 {
+    static char buf[12];
     struct passwd *pw = getpwuid(uid);
-    return pw ? pw->pw_name : utoa(uid);
+    return pw ? pw->pw_name : utoa_to_buf(uid, buf, sizeof(buf));
 }
 
 static char *getgroupname(gid_t gid)
 {
+    static char buf[12];
     struct group *gr = getgrgid(gid);
-    return gr ? gr->gr_name : utoa(gid);
+    return gr ? gr->gr_name : utoa_to_buf(gid, buf, sizeof(buf));
 }
 
 // Figure out size of printable entry fields for display indent/wrap
-- 
1.7.9.dirty

_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to