iplib: Make netmkaddr() threadsafe
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 7 Jan 2017 17:30:51 +0000 (12:30 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:40 +0000 (19:01 -0500)
You can't use static arrays like that; either the caller provides the
memory (which is what I did) or the function dynamically allocates.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
tests/ping.c
tests/ttcp.c
user/iplib/include/iplib/iplib.h
user/iplib/netmkaddr.c

index d3fa5e5..2861392 100644 (file)
@@ -78,7 +78,6 @@ extern int dec64(uint8_t * unused_uint8_p_t, int unused_int,
 extern void qsort(void *, long, long, int (*)(void *, void *));
 
 extern int toupper(int);
-extern char *netmkaddr(char *unused_char_p_t, char *, char *);
 extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 
index bc0e707..91b213b 100644 (file)
@@ -508,7 +508,7 @@ void *rcvr_thread(void* arg)
 
 int main(int argc, char **argv)
 {
-       char *ds;
+       char *ds, ds_store[256];
        int pid;
        pthread_t rcvr;
 
@@ -590,7 +590,7 @@ int main(int argc, char **argv)
 
        if (!isv4name(argv[0]))
                proto = &v6pr;
-       ds = netmkaddr(argv[0], proto->net, "1");
+       ds = netmkaddr(argv[0], proto->net, "1", ds_store, sizeof(ds_store));
        printf("ping: dial %s\n", ds);
        fd = dial9(ds, 0, 0, 0, 0);
        if(fd < 0){
index fce365d..4a68296 100644 (file)
@@ -134,6 +134,7 @@ double rate(long nbytes, double time)
 void reader(int udp, char *addr, char *port, int buflen, int nbuf, int sink)
 {
        char *buf, adir[40], ldir[40];
+       char *ds, ds_store[256];
        int fd, cnt, acfd, lcfd;
        long nbytes = 0;
        long now;
@@ -144,7 +145,8 @@ void reader(int udp, char *addr, char *port, int buflen, int nbuf, int sink)
        fprintf(stderr, "ttcp-r: buflen=%d, nbuf=%d, port=%s %s\n",
                buflen, nbuf, port, udp ? "udp" : "tcp");
 
-       acfd = announce9(netmkaddr(addr, udp ? "udp" : "tcp", port), adir, 0);
+       ds = netmkaddr(addr, udp ? "udp" : "tcp", port, ds_store, sizeof(ds_store));
+       acfd = announce9(ds, adir, 0);
        if (acfd < 0)
                sysfatal("announce: %r");
        buf = malloc(buflen);
index 94cdabc..6af6815 100644 (file)
@@ -284,7 +284,8 @@ extern uint8_t IPallbits[IPaddrlen];
 
 int tokenize(char *s, char **args, int maxargs);
 int getfields(char *str, char **args, int max, int mflag, char *unused_set);
-char *netmkaddr(char *linear, char *defnet, char *defsrv);
+char *netmkaddr(char *linear, char *defnet, char *defsrv, char *buf,
+                size_t buf_sz);
 int dial9(char *dest, char *local, char *dir, int *cfdp, int flags);
 int clone9(char *addr, char *dir, int flags);
 int announce9(char *addr, char *dir, int flags);
index 9d5f52a..277ef8c 100644 (file)
 #include <sys/types.h>
 #include <unistd.h>
 
-/* truncate functionality for now. No lib/ndb.
-#include <libnet.h>
- */
-
-/*
- *  make an address, add the defaults
+/* Makes an address suitable for dialing or announcing.  Takes an address along
+ * with a default network and service to use if they are not specified in the
+ * address.
  *
- *  if you pass in only one ! in linear, this assumes this ! was between the net
- *  and the host.  if you pass in no !s, we'll build one from defnet/defsrv.
- */
-char *netmkaddr(char *linear, char *defnet, char *defsrv)
+ * Returns a pointer to data in buf[buf_sz] holding the actual address to use.
+ * The caller manages the memory for buf.
+ *
+ * If you pass in only one ! in linear, this assumes this ! was between the net
+ * and the host.  If you pass in no !s, we'll build one from defnet/defsrv. */
+char *netmkaddr(char *linear, char *defnet, char *defsrv, char *buf,
+                size_t buf_sz)
 {
-       /* TODO: this isn't threadsafe */
-       static char addr[256];
        char *cp;
 
        /*
@@ -37,17 +35,16 @@ char *netmkaddr(char *linear, char *defnet, char *defsrv)
        if (cp == 0) {
                if (defnet == 0) {
                        if (defsrv)
-                               snprintf(addr, sizeof(addr), "net!%s!%s", linear, defsrv);
+                               snprintf(buf, buf_sz, "net!%s!%s", linear, defsrv);
                        else
-                               snprintf(addr, sizeof(addr), "net!%s", linear);
+                               snprintf(buf, buf_sz, "net!%s", linear);
                } else {
                        if (defsrv)
-                               snprintf(addr, sizeof(addr), "%s!%s!%s", defnet, linear,
-                                        defsrv);
+                               snprintf(buf, buf_sz, "%s!%s!%s", defnet, linear, defsrv);
                        else
-                               snprintf(addr, sizeof(addr), "%s!%s", defnet, linear);
+                               snprintf(buf, buf_sz, "%s!%s", defnet, linear);
                }
-               return addr;
+               return buf;
        }
 
        /*
@@ -62,7 +59,7 @@ char *netmkaddr(char *linear, char *defnet, char *defsrv)
         */
        if (defsrv == 0)
                return linear;
-       snprintf(addr, sizeof(addr), "%s!%s", linear, defsrv);
+       snprintf(buf, buf_sz, "%s!%s", linear, defsrv);
 
-       return addr;
+       return buf;
 }