• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*--------------------------------------------------------------------*/
2 /*--- Relay between gdb and gdbserver embedded in valgrind  vgdb.c ---*/
3 /*--------------------------------------------------------------------*/
4 
5 /*
6    This file is part of Valgrind, a dynamic binary instrumentation
7    framework.
8 
9    Copyright (C) 2011-2017 Philippe Waroquiers
10 
11    This program is free software; you can redistribute it and/or
12    modify it under the terms of the GNU General Public License as
13    published by the Free Software Foundation; either version 2 of the
14    License, or (at your option) any later version.
15 
16    This program is distributed in the hope that it will be useful, but
17    WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19    General Public License for more details.
20 
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24    02111-1307, USA.
25 
26    The GNU General Public License is contained in the file COPYING.
27 */
28 
29 #include "vgdb.h"
30 
31 #include "config.h"
32 
33 #include <assert.h>
34 #include <dirent.h>
35 #include <errno.h>
36 #include <fcntl.h>
37 #include <limits.h>
38 #include <poll.h>
39 #include <pthread.h>
40 #include <signal.h>
41 #include <stdlib.h>
42 #include <stdio.h>
43 #include <string.h>
44 #include <unistd.h>
45 #include <netinet/in.h>
46 #include <sys/mman.h>
47 #include <sys/socket.h>
48 #include <sys/stat.h>
49 #include <sys/time.h>
50 
51 /* vgdb has two usages:
52    1. relay application between gdb and the gdbserver embedded in valgrind.
53    2. standalone to send monitor commands to a running valgrind-ified process
54 
55    It is made of a main program which reads arguments.  If no
56    arguments are given or only --pid and --vgdb-prefix, then usage 1 is
57    assumed.
58 
59    As relay application, vgdb reads bytes from gdb on stdin and
60    writes these bytes to valgrind.  Bytes read from valgrind are
61    written to gdb on stdout.  Read/Write from/to valgrind is done
62    using FIFOs.  There is one thread reading from stdin, writing to
63    valgrind on a FIFO.  There is one thread reading from valgrind on a
64    FIFO, writing to gdb on stdout
65 
66    As a standalone utility, vgdb builds command packets to write to valgrind,
67    sends it and reads the reply. The same two threads are used to write/read.
68    Once all the commands are sent and their replies received, vgdb will exit.
69 */
70 
71 int debuglevel;
72 struct timeval dbgtv;
73 static char *vgdb_prefix = NULL;
74 
75 /* Will be set to True when any condition indicating we have to shutdown
76    is encountered. */
77 Bool shutting_down = False;
78 
79 VgdbShared32 *shared32;
80 VgdbShared64 *shared64;
81 #define VS_written_by_vgdb (shared32 != NULL ?        \
82                             shared32->written_by_vgdb \
83                             : shared64->written_by_vgdb)
84 #define VS_seen_by_valgrind (shared32 != NULL ?         \
85                              shared32->seen_by_valgrind \
86                              : shared64->seen_by_valgrind)
87 
88 #define VS_vgdb_pid (shared32 != NULL ? shared32->vgdb_pid : shared64->vgdb_pid)
89 
vmalloc(size_t size)90 void *vmalloc(size_t size)
91 {
92    void * mem = malloc(size);
93    if (mem == NULL)
94       XERROR (errno, "can't allocate memory\n");
95    return mem;
96 }
97 
vrealloc(void * ptr,size_t size)98 void *vrealloc(void *ptr,size_t size)
99 {
100    void * mem = realloc(ptr, size);
101    if (mem == NULL)
102       XERROR (errno, "can't reallocate memory\n");
103    return mem;
104 }
105 
106 /* Return the name of a directory for temporary files. */
107 static
vgdb_tmpdir(void)108 const char *vgdb_tmpdir(void)
109 {
110    const char *tmpdir;
111 
112    tmpdir = getenv("TMPDIR");
113    if (tmpdir == NULL || *tmpdir == '\0')
114      tmpdir = VG_TMPDIR;
115    if (tmpdir == NULL || *tmpdir == '\0')
116      tmpdir = "/tmp";    /* fallback */
117 
118    return tmpdir;
119 }
120 
121 /* Return the default path prefix for the named pipes (FIFOs) used by vgdb/gdb
122    to communicate with valgrind */
123 static
vgdb_prefix_default(void)124 char *vgdb_prefix_default(void)
125 {
126    static HChar *prefix;
127 
128    if (prefix == NULL) {
129       const char *tmpdir = vgdb_tmpdir();
130       prefix = vmalloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1);
131       strcpy(prefix, tmpdir);
132       strcat(prefix, "/vgdb-pipe");
133    }
134    return prefix;
135 }
136 
137 /* add nrw to the written_by_vgdb field of shared32 or shared64 */
138 static
add_written(int nrw)139 void add_written(int nrw)
140 {
141    if (shared32 != NULL)
142       shared32->written_by_vgdb += nrw;
143    else if (shared64 != NULL)
144       shared64->written_by_vgdb += nrw;
145    else
146       assert(0);
147 }
148 
149 static int shared_mem_fd = -1;
150 static
map_vgdbshared(char * shared_mem)151 void map_vgdbshared (char* shared_mem)
152 {
153    struct stat fdstat;
154    void **s;
155    shared_mem_fd = open(shared_mem, O_RDWR);
156    /* shared_mem_fd will not be closed till vgdb exits. */
157 
158    if (shared_mem_fd == -1)
159       XERROR (errno, "error opening %s shared memory file\n", shared_mem);
160 
161    if (fstat(shared_mem_fd, &fdstat) != 0)
162       XERROR (errno, "fstat");
163 
164    if (fdstat.st_size == sizeof(VgdbShared64))
165       s = (void*) &shared64;
166    else if (fdstat.st_size == sizeof(VgdbShared32))
167       s = (void*) &shared32;
168    else
169 #if VEX_HOST_WORDSIZE == 8
170       XERROR (0,
171               "error size shared memory file %s.\n"
172               "expecting size %d (64bits) or %d (32bits) got %ld.\n",
173               shared_mem,
174               (int) sizeof(VgdbShared64), (int) sizeof(VgdbShared32),
175               (long int)fdstat.st_size);
176 #elif VEX_HOST_WORDSIZE == 4
177       XERROR (0,
178               "error size shared memory file %s.\n"
179               "expecting size %d (32bits) got %ld.\n",
180               shared_mem,
181               (int) sizeof(VgdbShared32),
182               fdstat.st_size);
183 #else
184 # error "unexpected wordsize"
185 #endif
186 
187 #if VEX_HOST_WORDSIZE == 4
188    if (shared64 != NULL)
189       XERROR (0, "cannot use 32 bits vgdb with a 64bits valgrind process\n");
190    /* But we can use a 64 bits vgdb with a 32 bits valgrind */
191 #endif
192 
193    *s = (void*) mmap (NULL, fdstat.st_size,
194                       PROT_READ|PROT_WRITE, MAP_SHARED,
195                       shared_mem_fd, 0);
196 
197    if (*s == (void *) -1)
198       XERROR (errno, "error mmap shared memory file %s\n", shared_mem);
199 
200 }
201 
202 /* This function loops till shutting_down becomes true.  In this loop,
203    it verifies if valgrind process is reading the characters written
204    by vgdb.  The verification is done every max_invoke_ms ms.  If
205    valgrind is not reading characters, it will use invoker_invoke_gdbserver
206    to ensure that the gdbserver code is called soon by valgrind. */
207 static int max_invoke_ms = 100;
208 #define NEVER 99999999
209 static int cmd_time_out = NEVER;
210 static
invoke_gdbserver_in_valgrind(void * v_pid)211 void *invoke_gdbserver_in_valgrind(void *v_pid)
212 {
213    struct timeval cmd_max_end_time;
214    Bool cmd_started = False;
215    struct timeval invoke_time;
216 
217    int pid = *(int *)v_pid;
218    int written_by_vgdb_before_sleep;
219    int seen_by_valgrind_before_sleep;
220 
221    int invoked_written = -1;
222    unsigned int usecs;
223 
224    pthread_cleanup_push(invoker_cleanup_restore_and_detach, v_pid);
225 
226    while (!shutting_down) {
227       written_by_vgdb_before_sleep = VS_written_by_vgdb;
228       seen_by_valgrind_before_sleep = VS_seen_by_valgrind;
229       DEBUG(3,
230             "written_by_vgdb_before_sleep %d "
231             "seen_by_valgrind_before_sleep %d\n",
232             written_by_vgdb_before_sleep,
233             seen_by_valgrind_before_sleep);
234       if (cmd_time_out != NEVER
235           && !cmd_started
236           && written_by_vgdb_before_sleep > seen_by_valgrind_before_sleep) {
237          /* A command was started. Record the time at which it was started. */
238          DEBUG(1, "IO for command started\n");
239          gettimeofday(&cmd_max_end_time, NULL);
240          cmd_max_end_time.tv_sec += cmd_time_out;
241          cmd_started = True;
242       }
243       if (max_invoke_ms > 0) {
244          usecs = 1000 * max_invoke_ms;
245          gettimeofday(&invoke_time, NULL);
246          invoke_time.tv_sec += max_invoke_ms / 1000;
247          invoke_time.tv_usec += 1000 * (max_invoke_ms % 1000);
248          invoke_time.tv_sec += invoke_time.tv_usec / (1000 * 1000);
249          invoke_time.tv_usec = invoke_time.tv_usec % (1000 * 1000);
250       } else {
251          usecs = 0;
252       }
253       if (cmd_started) {
254          // 0 usecs here means the thread just has to check gdbserver eats
255          // the characters in <= cmd_time_out seconds.
256          // We will just wait by 1 second max at a time.
257          if (usecs == 0 || usecs > 1000 * 1000)
258             usecs = 1000 * 1000;
259       }
260       usleep(usecs);
261 
262       /* If nothing happened during our sleep, let's try to wake up valgrind
263          or check for cmd time out. */
264       if (written_by_vgdb_before_sleep == VS_written_by_vgdb
265           && seen_by_valgrind_before_sleep == VS_seen_by_valgrind
266           && VS_written_by_vgdb > VS_seen_by_valgrind) {
267          struct timeval now;
268          gettimeofday(&now, NULL);
269          DEBUG(2,
270                "after sleep "
271                "written_by_vgdb %d "
272                "seen_by_valgrind %d "
273                "invoked_written %d\n",
274                VS_written_by_vgdb,
275                VS_seen_by_valgrind,
276                invoked_written);
277          /* if the pid does not exist anymore, we better stop */
278          if (kill(pid, 0) != 0)
279            XERROR (errno,
280                    "invoke_gdbserver_in_valgrind: "
281                    "check for pid %d existence failed\n", pid);
282          if (cmd_started) {
283             if (timercmp (&now, &cmd_max_end_time, >))
284                XERROR (0,
285                        "pid %d did not handle a command in %d seconds\n",
286                        pid, cmd_time_out);
287          }
288          if (max_invoke_ms > 0 && timercmp (&now, &invoke_time, >=)) {
289             /* only need to wake up if the nr written has changed since
290                last invoke. */
291             if (invoked_written != written_by_vgdb_before_sleep) {
292                if (invoker_invoke_gdbserver(pid)) {
293                   /* If invoke successful, no need to invoke again
294                      for the same value of written_by_vgdb_before_sleep. */
295                   invoked_written = written_by_vgdb_before_sleep;
296                }
297             }
298          }
299       } else {
300          // Something happened => restart timer check.
301          if (cmd_time_out != NEVER) {
302             DEBUG(2, "some IO was done => restart command\n");
303             cmd_started = False;
304          }
305       }
306    }
307    pthread_cleanup_pop(0);
308    return NULL;
309 }
310 
311 static
open_fifo(const char * name,int flags,const char * desc)312 int open_fifo (const char* name, int flags, const char* desc)
313 {
314    int fd;
315    DEBUG(1, "opening %s %s\n", name, desc);
316    fd = open(name, flags);
317    if (fd == -1)
318       XERROR (errno, "error opening %s %s\n", name, desc);
319 
320    DEBUG(1, "opened %s %s fd %d\n", name, desc, fd);
321    return fd;
322 }
323 
324 /* acquire a lock on the first byte of the given fd. If not successful,
325    exits with error.
326    This allows to avoid having two vgdb speaking with the same Valgrind
327    gdbserver as this causes serious headaches to the protocol. */
328 static
acquire_lock(int fd,int valgrind_pid)329 void acquire_lock (int fd, int valgrind_pid)
330 {
331    struct flock fl;
332    fl.l_type = F_WRLCK;
333    fl.l_whence = SEEK_SET;
334    fl.l_start = 0;
335    fl.l_len = 1;
336    if (fcntl(fd, F_SETLK, &fl) < 0) {
337       if (errno == EAGAIN || errno == EACCES) {
338          XERROR(errno,
339                 "Cannot acquire lock.\n"
340                 "Probably vgdb pid %d already speaks with Valgrind pid %d\n",
341                 VS_vgdb_pid,
342                 valgrind_pid);
343       } else {
344          XERROR(errno, "cannot acquire lock.\n");
345       }
346    }
347 
348    /* Here, we have the lock. It will be released when fd will be closed. */
349    /* We indicate our pid to Valgrind gdbserver */
350    if (shared32 != NULL)
351       shared32->vgdb_pid = getpid();
352    else if (shared64 != NULL)
353       shared64->vgdb_pid = getpid();
354    else
355       assert(0);
356 }
357 
358 #define PBUFSIZ 16384 /* keep in sync with server.h */
359 
360 /* read some characters from fd.
361    Returns the nr of characters read, -1 if error.
362    desc is a string used in tracing */
363 static
read_buf(int fd,char * buf,const char * desc)364 int read_buf (int fd, char* buf, const char* desc)
365 {
366    int nrread;
367    DEBUG(2, "reading %s\n", desc);
368    nrread = read(fd, buf, PBUFSIZ);
369    if (nrread == -1) {
370       ERROR (errno, "error reading %s\n", desc);
371       return -1;
372    }
373    buf[nrread] = '\0';
374    DEBUG(2, "read %s %s\n", desc, buf);
375    return nrread;
376 }
377 
378 /* write size bytes from buf to fd.
379    desc is a description of the action for which the write is done.
380    If notify, then add size to the shared cntr indicating to the
381    valgrind process that there is new data.
382    Returns True if write is ok, False if there was a problem. */
383 static
write_buf(int fd,const char * buf,int size,const char * desc,Bool notify)384 Bool write_buf(int fd, const char* buf, int size, const char* desc, Bool notify)
385 {
386    int nrwritten;
387    int nrw;
388    DEBUG(2, "writing %s len %d %.*s notify: %d\n", desc, size,
389          size, buf, notify);
390    nrwritten = 0;
391    while (nrwritten < size) {
392       nrw = write (fd, buf+nrwritten, size - nrwritten);
393       if (nrw == -1) {
394          ERROR(errno, "error write %s\n", desc);
395          return False;
396       }
397       nrwritten = nrwritten + nrw;
398       if (notify)
399          add_written(nrw);
400    }
401    return True;
402 }
403 
404 typedef enum {
405    FROM_GDB,
406    TO_GDB,
407    FROM_PID,
408    TO_PID } ConnectionKind;
409 static const int NumConnectionKind = TO_PID+1;
410 static
ppConnectionKind(ConnectionKind con)411 const char *ppConnectionKind (ConnectionKind con)
412 {
413    switch (con) {
414    case FROM_GDB: return "FROM_GDB";
415    case TO_GDB:   return "TO_GDB";
416    case FROM_PID: return "FROM_PID";
417    case TO_PID:   return "TO_PID";
418    default:       return "invalid connection kind";
419    }
420 }
421 
422 static char *shared_mem;
423 
424 static int from_gdb = 0; /* stdin by default, changed if --port is given. */
425 static char *from_gdb_to_pid; /* fifo name to write gdb command to pid */
426 /* Returns True in case read/write operations were done properly.
427    Returns False in case of error.
428    to_pid is the file descriptor to write to the process pid. */
429 static
read_from_gdb_write_to_pid(int to_pid)430 Bool read_from_gdb_write_to_pid(int to_pid)
431 {
432    char buf[PBUFSIZ+1]; // +1 for trailing \0
433    int nrread;
434 
435    nrread = read_buf(from_gdb, buf, "from gdb on stdin");
436    if (nrread <= 0) {
437       if (nrread == 0)
438          DEBUG(1, "read 0 bytes from gdb => assume exit\n");
439       else
440          DEBUG(1, "error reading bytes from gdb\n");
441       close (from_gdb);
442       shutting_down = True;
443       return False;
444    }
445    return write_buf(to_pid, buf, nrread, "to_pid", /* notify */ True);
446 }
447 
448 static int to_gdb = 1; /* stdout by default, changed if --port is given. */
449 static char *to_gdb_from_pid; /* fifo name to read pid replies */
450 /* Returns True in case read/write operations were done properly.
451    Returns False in case of error.
452    from_pid is the file descriptor to read data from the process pid. */
453 static
read_from_pid_write_to_gdb(int from_pid)454 Bool read_from_pid_write_to_gdb(int from_pid)
455 {
456    char buf[PBUFSIZ+1]; // +1 for trailing \0
457    int nrread;
458 
459    nrread = read_buf(from_pid, buf, "from pid");
460    if (nrread <= 0) {
461       if (nrread == 0)
462          DEBUG(1, "read 0 bytes from pid => assume exit\n");
463       else
464          DEBUG(1, "error reading bytes from pid\n");
465       close (from_pid);
466       shutting_down = True;
467       return False;
468    }
469    return write_buf(to_gdb, buf, nrread, "to_gdb", /* notify */ False);
470 }
471 
472 static
wait_for_gdb_connect(int in_port)473 void wait_for_gdb_connect (int in_port)
474 {
475    struct sockaddr_in addr;
476 
477    int listen_gdb = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
478    int gdb_connect;
479 
480    if (-1 == listen_gdb) {
481       XERROR(errno, "cannot create socket");
482    }
483 
484     memset(&addr, 0, sizeof(addr));
485 
486     addr.sin_family = AF_INET;
487     addr.sin_port = htons((unsigned short int)in_port);
488     addr.sin_addr.s_addr = INADDR_ANY;
489 
490     if (-1 == bind(listen_gdb,(struct sockaddr *)&addr, sizeof(addr))) {
491       XERROR(errno, "bind failed");
492     }
493     fprintf(stderr, "listening on port %d ...", in_port);
494     fflush(stderr);
495     if (-1 == listen(listen_gdb, 1)) {
496       XERROR(errno, "error listen failed");
497     }
498 
499     gdb_connect = accept(listen_gdb, NULL, NULL);
500     if (gdb_connect < 0) {
501         XERROR(errno, "accept failed");
502     }
503     fprintf(stderr, "connected.\n");
504     fflush(stderr);
505     close(listen_gdb);
506     from_gdb = gdb_connect;
507     to_gdb = gdb_connect;
508 }
509 
510 /* prepares the FIFOs filenames, map the shared memory. */
511 static
prepare_fifos_and_shared_mem(int pid)512 void prepare_fifos_and_shared_mem(int pid)
513 {
514    const HChar *user, *host;
515    unsigned len;
516 
517    user = getenv("LOGNAME");
518    if (user == NULL) user = getenv("USER");
519    if (user == NULL) user = "???";
520    if (strchr(user, '/')) user = "???";
521 
522    host = getenv("HOST");
523    if (host == NULL) host = getenv("HOSTNAME");
524    if (host == NULL) host = "???";
525    if (strchr(host, '/')) host = "???";
526 
527    len = strlen(vgdb_prefix) + strlen(user) + strlen(host) + 40;
528    from_gdb_to_pid = vmalloc (len);
529    to_gdb_from_pid = vmalloc (len);
530    shared_mem      = vmalloc (len);
531    /* below 3 lines must match the equivalent in remote-utils.c */
532    sprintf(from_gdb_to_pid, "%s-from-vgdb-to-%d-by-%s-on-%s",    vgdb_prefix,
533            pid, user, host);
534    sprintf(to_gdb_from_pid, "%s-to-vgdb-from-%d-by-%s-on-%s",    vgdb_prefix,
535            pid, user, host);
536    sprintf(shared_mem,      "%s-shared-mem-vgdb-%d-by-%s-on-%s", vgdb_prefix,
537            pid, user, host);
538    DEBUG (1, "vgdb: using %s %s %s\n",
539           from_gdb_to_pid, to_gdb_from_pid, shared_mem);
540 
541    map_vgdbshared(shared_mem);
542 }
543 
544 /* Convert hex digit A to a number.  */
545 
546 static int
fromhex(int a)547 fromhex (int a)
548 {
549    if (a >= '0' && a <= '9')
550       return a - '0';
551    else if (a >= 'a' && a <= 'f')
552       return a - 'a' + 10;
553    else
554       XERROR(0, "Reply contains invalid hex digit %c\n", a);
555   return 0;
556 }
557 
558 /* Returns next char from fd.  -1 if error, -2 if EOF.
559    NB: must always call it with the same fd */
560 static int
readchar(int fd)561 readchar (int fd)
562 {
563   static char buf[PBUFSIZ+1]; // +1 for trailing \0
564   static int bufcnt = 0;
565   static unsigned char *bufp;
566   // unsigned bufp to e.g. avoid having 255 converted to int -1
567 
568   if (bufcnt-- > 0)
569      return *bufp++;
570 
571   bufcnt = read_buf (fd, buf, "static buf readchar");
572 
573   if (bufcnt <= 0) {
574      if (bufcnt == 0) {
575         fprintf (stderr, "readchar: Got EOF\n");
576         return -2;
577      } else {
578         ERROR (errno, "readchar\n");
579         return -1;
580      }
581   }
582 
583   bufp = (unsigned char *)buf;
584   bufcnt--;
585   return *bufp++;
586 }
587 
588 /* Read a packet from fromfd, with error checking,
589    and store it in BUF.
590    If checksum incorrect, writes a - on ackfd.
591    Returns length of packet, or -1 if error or -2 if EOF. */
592 static int
getpkt(char * buf,int fromfd,int ackfd)593 getpkt (char *buf, int fromfd, int ackfd)
594 {
595   char *bp;
596   unsigned char csum, c1, c2;
597   int c;
598 
599   while (1) {
600      csum = 0;
601 
602      while (1) {
603         c = readchar (fromfd);
604         if (c == '$')
605            break;
606         DEBUG(2, "[getpkt: discarding char '%c']\n", c);
607         if (c < 0)
608            return c;
609      }
610 
611      bp = buf;
612      while (1) {
613         c = readchar (fromfd);
614         if (c < 0)
615            return c;
616         if (c == '#')
617            break;
618         if (c == '*') {
619            int repeat;
620            int r;
621            int prev;
622            prev = *(bp-1);
623            csum += c;
624            repeat = readchar (fromfd);
625            csum += repeat;
626            for (r = 0; r < repeat - 29; r ++)
627               *bp++ = prev;
628         } else {
629            *bp++ = c;
630            csum += c;
631         }
632      }
633      *bp = 0;
634 
635      c1 = fromhex (readchar (fromfd));
636      c2 = fromhex (readchar (fromfd));
637 
638      if (csum == (c1 << 4) + c2)
639 	break;
640 
641      fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
642               (c1 << 4) + c2, csum, buf);
643      if (write (ackfd, "-", 1) != 1)
644         ERROR(0, "error when writing - (nack)\n");
645      else
646         add_written(1);
647   }
648 
649   DEBUG(2, "getpkt (\"%s\");  [no ack] \n", buf);
650   return bp - buf;
651 }
652 
653 static int sigint = 0;
654 static int sigterm = 0;
655 static int sigpipe = 0;
656 static int sighup = 0;
657 static int sigusr1 = 0;
658 static int sigalrm = 0;
659 static int sigusr1_fd = -1;
660 static pthread_t invoke_gdbserver_in_valgrind_thread;
661 
662 static
received_signal(int signum)663 void received_signal (int signum)
664 {
665    if (signum == SIGINT)
666       sigint++;
667    else if (signum == SIGUSR1) {
668       sigusr1++;
669       if (sigusr1_fd >= 0) {
670          char control_c = '\003';
671          write_buf(sigusr1_fd, &control_c, 1,
672                    "write \\003 on SIGUSR1", /* notify */ True);
673       }
674    }
675    else if (signum == SIGTERM) {
676       shutting_down = True;
677       sigterm++;
678    } else if (signum == SIGHUP) {
679       shutting_down = True;
680       sighup++;
681    } else if (signum == SIGPIPE) {
682       sigpipe++;
683    } else if (signum == SIGALRM) {
684       sigalrm++;
685 #if defined(__BIONIC__)
686       /* Android has no pthread_cancel. As it also does not have
687          an invoker implementation, there is no need for cleanup action.
688          So, we just do nothing. */
689       DEBUG(1, "sigalrm received, no action on android\n");
690 #else
691       /* Note: we cannot directly invoke restore_and_detach : this must
692          be done by the thread that has attached.
693          We have in this thread pushed a cleanup handler that will
694          cleanup what is needed. */
695       DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n");
696       pthread_cancel(invoke_gdbserver_in_valgrind_thread);
697 #endif
698    } else {
699       ERROR(0, "unexpected signal %d\n", signum);
700    }
701 }
702 
703 /* install the signal handlers allowing e.g. vgdb to cleanup in
704    case of termination. */
705 static
install_handlers(void)706 void install_handlers(void)
707 {
708    struct sigaction action, oldaction;
709 
710    action.sa_handler = received_signal;
711    sigemptyset (&action.sa_mask);
712    action.sa_flags = 0;
713 
714    /* SIGINT: when user types C-c in gdb, this sends
715       a SIGINT to vgdb + causes a character to be sent to remote gdbserver.
716       The later is enough to wakeup the valgrind process. */
717    if (sigaction (SIGINT, &action, &oldaction) != 0)
718       XERROR (errno, "vgdb error sigaction SIGINT\n");
719    /* We might do something more intelligent than just
720       reporting this SIGINT E.g. behave similarly to the gdb: two
721       control-C without feedback from the debugged process would
722       mean to stop debugging it. */
723 
724    /* SIGUSR1: this is used to facilitate automatic testing.  When
725       vgdb receives this signal, it will simulate the user typing C-c. */
726    if (sigaction (SIGUSR1, &action, &oldaction) != 0)
727       XERROR (errno, "vgdb error sigaction SIGUSR1\n");
728 
729 
730    /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb
731       when detaching or similar. A clean shutdown will be done as both
732       the read and write side will detect an end of file. */
733    if (sigaction (SIGTERM, &action, &oldaction) != 0)
734       XERROR (errno, "vgdb error sigaction SIGTERM\n");
735 
736    /* SIGPIPE: can receive this signal when gdb detaches or kill the
737       process debugged: gdb will close its pipes to vgdb. vgdb
738       must resist to this signal to allow a clean shutdown. */
739    if (sigaction (SIGPIPE, &action, &oldaction) != 0)
740       XERROR (errno, "vgdb error sigaction SIGPIPE\n");
741 
742    /* SIGALRM: in case invoke thread is blocked, alarm is used
743       to cleanup.  */
744    if (sigaction (SIGALRM, &action, &oldaction) != 0)
745       XERROR (errno, "vgdb error sigaction SIGALRM\n");
746 
747    /* unmask all signals, in case the process that launched vgdb
748       masked some. */
749    if (sigprocmask (SIG_SETMASK, &action.sa_mask, NULL) != 0)
750       XERROR (errno, "vgdb error sigprocmask");
751 }
752 
753 /* close the FIFOs provided connections, terminate the invoker thread.  */
754 static
close_connection(int to_pid,int from_pid)755 void close_connection(int to_pid, int from_pid)
756 {
757    DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n",
758          sigint, sigterm, sighup, sigpipe);
759    /* Note that we do not forward sigterm to the valgrind process:
760       a sigterm signal is (probably) received from gdb if the user wants to
761       kill the debugged process. The kill instruction has been given to
762       the valgrind process, which should execute a clean exit. */
763 
764    /* We first close the connection to pid. The pid will then
765       terminates its gdbserver work. We keep the from pid
766       fifo opened till the invoker thread is finished.
767       This allows the gdbserver to finish sending its last reply. */
768    if (close(to_pid) != 0)
769       ERROR(errno, "close to_pid\n");
770 
771    /* if there is a task that was busy trying to wake up valgrind
772       process, we wait for it to be terminated otherwise threads
773       in the valgrind process can stay stopped if vgdb main
774       exits before the invoke thread had time to detach from
775       all valgrind threads. */
776    if (max_invoke_ms > 0 || cmd_time_out != NEVER) {
777       int join;
778 
779       /* It is surprisingly complex to properly shutdown or exit the
780          valgrind process in which gdbserver has been invoked through
781          ptrace.  In the normal case (gdb detaches from the process,
782          or process is continued), the valgrind process will reach the
783          breakpoint place.  Using ptrace, vgdb will ensure the
784          previous activity of the process is resumed (e.g. restart a
785          blocking system call).  The special case is when gdb asks the
786          valgrind process to exit (using either the "kill" command or
787          "monitor exit").  In such a case, the valgrind process will
788          call exit.  But a ptraced process will be blocked in exit,
789          waiting for the ptracing process to detach or die. vgdb
790          cannot detach unconditionally as otherwise, in the normal
791          case, the valgrind process would stop abnormally with SIGSTOP
792          (as vgdb would not be there to catch it). vgdb can also not
793          die unconditionally otherwise again, similar problem.  So, we
794          assume that most of the time, we arrive here in the normal
795          case, and so, the breakpoint has been encountered by the
796          valgrind process, so the invoker thread will exit and the
797          join will succeed.  For the "kill" case, we cause an alarm
798          signal to be sent after a few seconds. This means that in the
799          normal case, the gdbserver code in valgrind process must have
800          returned the control in less than the alarm nr of seconds,
801          otherwise, valgrind will stop abnormally with SIGSTOP. */
802       (void) alarm (3);
803 
804       DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n");
805       join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL);
806       if (join != 0)
807          XERROR
808             (join,
809              "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n");
810    }
811    if (close(from_pid) != 0)
812       ERROR(errno, "close from_pid\n");
813 }
814 
815 /* Relay data between gdb and Valgrind gdbserver, till EOF or an
816    error is encountered. */
817 static
gdb_relay(int pid)818 void gdb_relay (int pid)
819 {
820    int from_pid = -1; /* fd to read from pid */
821    int to_pid = -1; /* fd to write to pid */
822 
823    int shutdown_loop = 0;
824    fprintf (stderr, "relaying data between gdb and process %d\n", pid);
825    fflush (stderr);
826 
827    if (max_invoke_ms > 0)
828       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
829                      invoke_gdbserver_in_valgrind, (void *) &pid);
830    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
831    acquire_lock (shared_mem_fd, pid);
832 
833    from_pid = open_fifo (to_gdb_from_pid, O_RDONLY|O_NONBLOCK,
834                          "read mode from pid");
835 
836    sigusr1_fd = to_pid; /* allow simulating user typing control-c */
837 
838    while (1) {
839       ConnectionKind ck;
840       int ret;
841       struct pollfd pollfds[NumConnectionKind];
842 
843       /* watch data written by gdb, watch POLLERR on both gdb fd */
844       pollfds[FROM_GDB].fd = from_gdb;
845       pollfds[FROM_GDB].events = POLLIN;
846       pollfds[FROM_GDB].revents = 0;
847       pollfds[TO_GDB].fd = to_gdb;
848       pollfds[TO_GDB].events = 0;
849       pollfds[TO_GDB].revents = 0;
850 
851       /* watch data written by pid, watch POLLERR on both pid fd */
852       pollfds[FROM_PID].fd = from_pid;
853       pollfds[FROM_PID].events = POLLIN;
854       pollfds[FROM_PID].revents = 0;
855       pollfds[TO_PID].fd = to_pid;
856       pollfds[TO_PID].events = 0;
857       pollfds[TO_PID].revents = 0;
858 
859       ret = poll(pollfds,
860                  NumConnectionKind,
861                  (shutting_down ?
862                   1 /* one second */
863                   : -1 /* infinite */));
864       DEBUG(2, "poll ret %d errno %d\n", ret, errno);
865 
866       /* check for unexpected error */
867       if (ret <= 0 && errno != EINTR) {
868          ERROR (errno, "unexpected poll ret %d\n", ret);
869          shutting_down = True;
870          break;
871       }
872 
873       /* check for data to read */
874       for (ck = 0; ck < NumConnectionKind; ck ++) {
875          if (pollfds[ck].revents & POLLIN) {
876             switch (ck) {
877             case FROM_GDB:
878                if (!read_from_gdb_write_to_pid(to_pid))
879                   shutting_down = True;
880                break;
881             case FROM_PID:
882                if (!read_from_pid_write_to_gdb(from_pid))
883                   shutting_down = True;
884                break;
885             default: XERROR(0, "unexpected POLLIN on %s\n",
886                                ppConnectionKind(ck));
887             }
888          }
889       }
890 
891       /* check for an fd being in error condition */
892       for (ck = 0; ck < NumConnectionKind; ck ++) {
893          if (pollfds[ck].revents & POLLERR) {
894             DEBUG(1, "connection %s fd %d POLLERR error condition\n",
895                      ppConnectionKind(ck), pollfds[ck].fd);
896             invoker_valgrind_dying();
897             shutting_down = True;
898          }
899          if (pollfds[ck].revents & POLLHUP) {
900             DEBUG(1, "connection %s fd %d POLLHUP error condition\n",
901                   ppConnectionKind(ck), pollfds[ck].fd);
902             invoker_valgrind_dying();
903             shutting_down = True;
904          }
905          if (pollfds[ck].revents & POLLNVAL) {
906             DEBUG(1, "connection %s fd %d POLLNVAL error condition\n",
907                   ppConnectionKind(ck), pollfds[ck].fd);
908             invoker_valgrind_dying();
909             shutting_down = True;
910          }
911       }
912 
913       if (shutting_down) {
914          /* we let some time to the final packets to be transferred */
915          shutdown_loop++;
916          if (shutdown_loop > 3)
917             break;
918       }
919    }
920    close_connection(to_pid, from_pid);
921 }
922 
packet_len_for_command(char * cmd)923 static int packet_len_for_command(char *cmd)
924 {
925    /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc      */
926    return                          7+     2*strlen(cmd)             +3  + 1;
927 }
928 
929 /* hyper-minimal protocol implementation that
930    sends the provided commands (using qRcmd packets)
931    and read and display their replies. */
932 static
standalone_send_commands(int pid,int last_command,char * commands[])933 void standalone_send_commands(int pid,
934                               int last_command,
935                               char *commands[] )
936 {
937    int from_pid = -1; /* fd to read from pid */
938    int to_pid = -1; /* fd to write to pid */
939 
940    int i;
941    int hi;
942    char hex[3];
943    unsigned char cksum;
944    char *hexcommand;
945    char buf[PBUFSIZ+1]; // +1 for trailing \0
946    int buflen;
947    int nc;
948 
949 
950    if (max_invoke_ms > 0 || cmd_time_out != NEVER)
951       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
952                      invoke_gdbserver_in_valgrind, (void *) &pid);
953 
954    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
955    acquire_lock (shared_mem_fd, pid);
956 
957    /* first send a C-c \003 to pid, so that it wakes up the process
958       After that, we can open the fifo from the pid in read mode
959       We then start to wait for packets (normally first a resume reply)
960       At that point, we send our command and expect replies */
961    buf[0] = '\003';
962    i = 0;
963    while (!write_buf(to_pid, buf, 1,
964                      "write \\003 to wake up", /* notify */ True)) {
965       /* If write fails, retries up to 10 times every 0.5 seconds
966          This aims at solving the race condition described in
967          remote-utils.c remote_finish function. */
968       usleep(500*1000);
969       i++;
970       if (i >= 10)
971          XERROR (errno, "failed to send wake up char after 10 trials\n");
972    }
973    from_pid = open_fifo(to_gdb_from_pid, O_RDONLY,
974                         "read cmd result from pid");
975 
976    /* Enable no ack mode. */
977    write_buf(to_pid, "$QStartNoAckMode#b0", 19, "write start no ack mode",
978              /* notify */ True);
979    buflen = getpkt(buf, from_pid, to_pid);
980    if (buflen != 2 || strcmp(buf, "OK") != 0) {
981       if (buflen != 2)
982          ERROR (0, "no ack mode: unexpected buflen %d\n", buflen);
983       else
984          ERROR (0, "no ack mode: unexpected packet %s\n", buf);
985    }
986 
987    for (nc = 0; nc <= last_command; nc++) {
988       fprintf (stderr, "sending command %s to pid %d\n", commands[nc], pid);
989       fflush (stderr);
990 
991       /* prepare hexcommand $qRcmd,xxxx....................xx#cc      */
992       hexcommand = vmalloc (packet_len_for_command(commands[nc]));
993       hexcommand[0] = 0;
994       strcat (hexcommand, "$qRcmd,");
995       for (i = 0; i < strlen(commands[nc]); i++) {
996          sprintf(hex, "%02x", (unsigned char) commands[nc][i]);
997          // Need to use unsigned char, to avoid sign extension.
998          strcat (hexcommand, hex);
999       }
1000       /* checksum (but without the $) */
1001       cksum = 0;
1002       for (hi = 1; hi < strlen(hexcommand); hi++)
1003          cksum+=hexcommand[hi];
1004       strcat(hexcommand, "#");
1005       sprintf(hex, "%02x", cksum);
1006       strcat(hexcommand, hex);
1007       write_buf(to_pid, hexcommand, strlen(hexcommand),
1008                 "writing hex command to pid", /* notify */ True);
1009 
1010       /* we exit of the below loop explicitly when the command has
1011          been handled or because a signal handler will set
1012          shutting_down. */
1013       while (!shutting_down) {
1014          buflen = getpkt(buf, from_pid, to_pid);
1015          if (buflen < 0) {
1016             ERROR (0, "error reading packet\n");
1017             if (buflen == -2)
1018                invoker_valgrind_dying();
1019             break;
1020          }
1021          if (strlen(buf) == 0) {
1022             DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n");
1023             break;
1024          }
1025          if (strcmp(buf, "OK") == 0) {
1026             DEBUG(1, "OK packet rcvd\n");
1027             break;
1028          }
1029          if (buf[0] == 'E') {
1030             DEBUG(0,
1031                   "E NN error packet rcvd: %s (unknown monitor command?)\n",
1032                   buf);
1033             break;
1034          }
1035          if (buf[0] == 'W') {
1036             DEBUG(0, "W stopped packet rcvd: %s\n", buf);
1037             break;
1038          }
1039          if (buf[0] == 'T') {
1040             DEBUG(1, "T resume reply packet received: %s\n", buf);
1041             continue;
1042          }
1043 
1044          /* must be here an O packet with hex encoded string reply
1045             => decode and print it */
1046          if (buf[0] != 'O') {
1047             DEBUG(0, "expecting O packet, received: %s\n", buf);
1048             continue;
1049          }
1050          {
1051             char buf_print[buflen/2 + 1];
1052             for (i = 1; i < buflen; i = i + 2)
1053                buf_print[i/2] = (fromhex(*(buf+i)) << 4)
1054                      + fromhex(*(buf+i+1));
1055             buf_print[buflen/2] = 0;
1056             printf("%s", buf_print);
1057             fflush(stdout);
1058          }
1059       }
1060       free (hexcommand);
1061    }
1062    shutting_down = True;
1063 
1064    close_connection(to_pid, from_pid);
1065 }
1066 
1067 /* report to user the existence of a vgdb-able valgrind process
1068    with given pid.
1069    Note: this function does not use XERROR if an error is encountered
1070    while producing the command line for pid, as this is not critical
1071    and at least on MacOS, reading cmdline is not available. */
1072 static
report_pid(int pid,Bool on_stdout)1073 void report_pid (int pid, Bool on_stdout)
1074 {
1075    char cmdline_file[50];   // large enough
1076    int fd, i;
1077    FILE *out = on_stdout ? stdout : stderr;
1078 
1079    fprintf(out, "use --pid=%d for ", pid);
1080 
1081    sprintf(cmdline_file, "/proc/%d/cmdline", pid);
1082    fd = open (cmdline_file, O_RDONLY);
1083    if (fd == -1) {
1084       DEBUG(1, "error opening cmdline file %s %s\n",
1085             cmdline_file, strerror(errno));
1086       fprintf(out, "(could not open process command line)\n");
1087    } else {
1088       char cmdline[100];
1089       ssize_t sz;
1090       while ((sz = read(fd, cmdline, sizeof cmdline - 1)) != 0) {
1091          for (i = 0; i < sz; i++)
1092             if (cmdline[i] == 0)
1093                cmdline[i] = ' ';
1094          cmdline[sz] = 0;
1095          fprintf(out, "%s", cmdline);
1096       }
1097       if (sz == -1) {
1098          DEBUG(1, "error reading cmdline file %s %s\n",
1099                cmdline_file, strerror(errno));
1100          fprintf(out, "(error reading process command line)");
1101       }
1102       fprintf(out, "\n");
1103       close (fd);
1104    }
1105    fflush(out);
1106 }
1107 
1108 static
usage(void)1109 void usage(void)
1110 {
1111    fprintf(stderr,
1112 "Usage: vgdb [OPTION]... [[-c] COMMAND]...\n"
1113 "vgdb (valgrind gdb) has two usages\n"
1114 "  1. standalone to send monitor commands to a Valgrind gdbserver.\n"
1115 "     The OPTION(s) must be followed by the command to send\n"
1116 "     To send more than one command, separate the commands with -c\n"
1117 "  2. relay application between gdb and a Valgrind gdbserver.\n"
1118 "     Only OPTION(s) can be given.\n"
1119 "\n"
1120 " OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n"
1121 "             [--wait=<number>] [--max-invoke-ms=<number>]\n"
1122 "             [--port=<portnr>\n"
1123 "             [--cmd-time-out=<number>] [-l] [-D] [-d]\n"
1124 "             \n"
1125 "  --pid arg must be given if multiple Valgrind gdbservers are found.\n"
1126 "  --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n"
1127 "      if you want to change the prefix (default %s) for the FIFOs communication\n"
1128 "      between the Valgrind gdbserver and vgdb.\n"
1129 "  --wait (default 0) tells vgdb to check during the specified number\n"
1130 "      of seconds if a Valgrind gdbserver can be found.\n"
1131 "  --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n"
1132 "      will force the invocation of the Valgrind gdbserver (if the Valgrind\n"
1133 "         process is blocked in a system call).\n"
1134 "  --port instructs vgdb to listen for gdb on the specified port nr.\n"
1135 "  --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n"
1136 "     gdbserver has not processed a command after number seconds\n"
1137 "  -l  arg tells to show the list of running Valgrind gdbserver and then exit.\n"
1138 "  -D  arg tells to show shared mem status and then exit.\n"
1139 "  -d  arg tells to show debug info. Multiple -d args for more debug info\n"
1140 "\n"
1141 "  -h --help shows this message\n"
1142 "  To get help from the Valgrind gdbserver, use vgdb help\n"
1143 "\n", vgdb_prefix_default()
1144            );
1145    invoker_restrictions_msg();
1146 }
1147 
1148 /* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated.
1149                  and then exits.
1150 
1151    else if arg_pid == -1, waits maximum check_trials seconds to discover
1152    a valgrind pid appearing.
1153 
1154    Otherwise verify arg_pid is valid and corresponds to a Valgrind process
1155    with gdbserver activated.
1156 
1157    Returns the pid to work with
1158    or exits in case of error (e.g. no pid found corresponding to arg_pid */
1159 
1160 static
search_arg_pid(int arg_pid,int check_trials,Bool show_list)1161 int search_arg_pid(int arg_pid, int check_trials, Bool show_list)
1162 {
1163    int i;
1164    int pid = -1;
1165 
1166    if (arg_pid == 0 || arg_pid < -1) {
1167       fprintf (stderr, "vgdb error: invalid pid %d given\n", arg_pid);
1168       exit (1);
1169    } else {
1170       /* search for a matching named fifo.
1171          If we have been given a pid, we will check that the matching FIFO is
1172          there (or wait the nr of check_trials for this to appear).
1173          If no pid has been given, then if we find only one FIFO,
1174          we will use this to build the pid to use.
1175          If we find multiple processes with valid FIFO, we report them and will
1176          exit with an error. */
1177       DIR *vgdb_dir;
1178       char *vgdb_dir_name = vmalloc (strlen (vgdb_prefix) + 3);
1179       struct dirent *f;
1180       int is;
1181       int nr_valid_pid = 0;
1182       const char *suffix = "-from-vgdb-to-"; /* followed by pid */
1183       char *vgdb_format = vmalloc (strlen(vgdb_prefix) + strlen(suffix) + 1);
1184 
1185       strcpy (vgdb_format, vgdb_prefix);
1186       strcat (vgdb_format, suffix);
1187 
1188       if (strchr(vgdb_prefix, '/') != NULL) {
1189          strcpy (vgdb_dir_name, vgdb_prefix);
1190          for (is = strlen(vgdb_prefix) - 1; is >= 0; is--)
1191             if (vgdb_dir_name[is] == '/') {
1192                vgdb_dir_name[is+1] = '\0';
1193                break;
1194             }
1195       } else {
1196          strcpy (vgdb_dir_name, "");
1197       }
1198 
1199       DEBUG(1, "searching pid in directory %s format %s\n",
1200             vgdb_dir_name, vgdb_format);
1201 
1202       /* try to find FIFOs with valid pid.
1203          On exit of the loop, pid is set to:
1204          the last pid found if show_list (or -1 if no process was listed)
1205          -1 if no FIFOs matching a running process is found
1206          -2 if multiple FIFOs of running processes are found
1207          otherwise it is set to the (only) pid found that can be debugged
1208       */
1209       for (i = 0; i < check_trials; i++) {
1210          DEBUG(1, "check_trial %d \n", i);
1211          if (i > 0)
1212            /* wait one second before checking again */
1213            sleep(1);
1214 
1215          vgdb_dir = opendir (strlen (vgdb_dir_name) ? vgdb_dir_name : "./");
1216          if (vgdb_dir == NULL)
1217             XERROR (errno,
1218                     "vgdb error: opening directory %s searching vgdb fifo\n",
1219                     vgdb_dir_name);
1220 
1221          errno = 0; /* avoid complain if vgdb_dir is empty */
1222          while ((f = readdir (vgdb_dir))) {
1223             struct stat st;
1224             char pathname[strlen(vgdb_dir_name) + strlen(f->d_name) + 1];
1225             char *wrongpid;
1226             int newpid;
1227 
1228             strcpy (pathname, vgdb_dir_name);
1229             strcat (pathname, f->d_name);
1230             DEBUG(3, "checking pathname is FIFO %s\n", pathname);
1231             if (stat (pathname, &st) != 0) {
1232                if (debuglevel >= 3)
1233                   ERROR (errno, "vgdb error: stat %s searching vgdb fifo\n",
1234                          pathname);
1235             } else if (S_ISFIFO (st.st_mode)) {
1236                DEBUG(3, "trying FIFO %s\n", pathname);
1237                if (strncmp (pathname, vgdb_format,
1238                             strlen (vgdb_format)) == 0) {
1239                   newpid = strtol(pathname + strlen (vgdb_format),
1240                                   &wrongpid, 10);
1241                   if (*wrongpid == '-' && newpid > 0
1242                       && kill (newpid, 0) == 0) {
1243                      nr_valid_pid++;
1244                      if (show_list) {
1245                         report_pid (newpid, /*on_stdout*/ True);
1246                         pid = newpid;
1247                      } else if (arg_pid != -1) {
1248                         if (arg_pid == newpid) {
1249                            pid = newpid;
1250                         }
1251                      } else if (nr_valid_pid > 1) {
1252                         if (nr_valid_pid == 2) {
1253                            fprintf
1254                               (stderr,
1255                                "no --pid= arg given"
1256                                " and multiple valgrind pids found:\n");
1257                            report_pid (pid, /*on_stdout*/ False);
1258                         }
1259                         pid = -2;
1260                         report_pid (newpid, /*on_stdout*/ False);
1261                      } else {
1262                         pid = newpid;
1263                      }
1264                   }
1265                }
1266             }
1267             errno = 0; /* avoid complain if at the end of vgdb_dir */
1268          }
1269          if (f == NULL && errno != 0)
1270             XERROR (errno, "vgdb error: reading directory %s for vgdb fifo\n",
1271                     vgdb_dir_name);
1272 
1273          closedir (vgdb_dir);
1274          if (pid != -1)
1275             break;
1276       }
1277 
1278       free (vgdb_dir_name);
1279       free (vgdb_format);
1280    }
1281 
1282    if (show_list) {
1283       exit (1);
1284    } else if (pid == -1) {
1285       if (arg_pid == -1)
1286          fprintf (stderr, "vgdb error: no FIFO found and no pid given\n");
1287       else
1288          fprintf (stderr, "vgdb error: no FIFO found matching pid %d\n",
1289                   arg_pid);
1290       exit (1);
1291    }
1292    else if (pid == -2) {
1293       /* no arg_pid given, multiple FIFOs found */
1294       exit (1);
1295    }
1296    else {
1297       return pid;
1298    }
1299 }
1300 
1301 /* return true if the numeric value of an option of the
1302    form --xxxxxxxxx=<number> could properly be extracted
1303    from arg. If True is returned, *value contains the
1304    extracted value.*/
1305 static
numeric_val(char * arg,int * value)1306 Bool numeric_val(char* arg, int *value)
1307 {
1308    const char *eq_pos = strchr(arg, '=');
1309    char *wrong;
1310    long long int long_value;
1311 
1312    if (eq_pos == NULL)
1313       return False;
1314 
1315    long_value = strtoll(eq_pos+1, &wrong, 10);
1316    if (long_value < 0 || long_value > INT_MAX)
1317       return False;
1318    if (*wrong)
1319       return False;
1320 
1321    *value = (int) long_value;
1322    return True;
1323 }
1324 
1325 /* true if arg matches the provided option */
1326 static
is_opt(char * arg,const char * option)1327 Bool is_opt(char* arg, const char *option)
1328 {
1329    int option_len = strlen(option);
1330    if (option[option_len-1] == '=')
1331       return (0 == strncmp(option, arg, option_len));
1332    else
1333       return (0 == strcmp(option, arg));
1334 }
1335 
1336 /* Parse command lines options. If error(s), exits.
1337    Otherwise returns the options in *p_... args.
1338    commands must be big enough for the commands extracted from argv.
1339    On return, *p_last_command gives the position in commands where
1340    the last command has been allocated (using vmalloc). */
1341 static
parse_options(int argc,char ** argv,Bool * p_show_shared_mem,Bool * p_show_list,int * p_arg_pid,int * p_check_trials,int * p_port,int * p_last_command,char * commands[])1342 void parse_options(int argc, char** argv,
1343                    Bool *p_show_shared_mem,
1344                    Bool *p_show_list,
1345                    int *p_arg_pid,
1346                    int *p_check_trials,
1347                    int *p_port,
1348                    int *p_last_command,
1349                    char *commands[])
1350 {
1351    Bool show_shared_mem = False;
1352    Bool show_list = False;
1353    int arg_pid = -1;
1354    int check_trials = 1;
1355    int last_command = -1;
1356    int int_port = 0;
1357 
1358    int i;
1359    int arg_errors = 0;
1360 
1361    for (i = 1; i < argc; i++) {
1362       if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) {
1363          usage();
1364          exit(0);
1365       } else if (is_opt(argv[i], "-d")) {
1366          debuglevel++;
1367       } else if (is_opt(argv[i], "-D")) {
1368          show_shared_mem = True;
1369       } else if (is_opt(argv[i], "-l")) {
1370          show_list = True;
1371       } else if (is_opt(argv[i], "--pid=")) {
1372          int newpid;
1373          if (!numeric_val(argv[i], &newpid)) {
1374             fprintf (stderr, "invalid --pid argument %s\n", argv[i]);
1375             arg_errors++;
1376          } else if (arg_pid != -1) {
1377             fprintf (stderr, "multiple --pid arguments given\n");
1378             arg_errors++;
1379          } else {
1380             arg_pid = newpid;
1381          }
1382       } else if (is_opt(argv[i], "--wait=")) {
1383          if (!numeric_val(argv[i], &check_trials)) {
1384             fprintf (stderr, "invalid --wait argument %s\n", argv[i]);
1385             arg_errors++;
1386          }
1387       } else if (is_opt(argv[i], "--max-invoke-ms=")) {
1388          if (!numeric_val(argv[i], &max_invoke_ms)) {
1389             fprintf (stderr, "invalid --max-invoke-ms argument %s\n", argv[i]);
1390             arg_errors++;
1391          }
1392       } else if (is_opt(argv[i], "--cmd-time-out=")) {
1393          if (!numeric_val(argv[i], &cmd_time_out)) {
1394             fprintf (stderr, "invalid --cmd-time-out argument %s\n", argv[i]);
1395             arg_errors++;
1396          }
1397       } else if (is_opt(argv[i], "--port=")) {
1398          if (!numeric_val(argv[i], &int_port)) {
1399             fprintf (stderr, "invalid --port argument %s\n", argv[i]);
1400             arg_errors++;
1401          }
1402       } else if (is_opt(argv[i], "--vgdb-prefix=")) {
1403          vgdb_prefix = argv[i] + 14;
1404       } else if (is_opt(argv[i], "-c")) {
1405          last_command++;
1406          commands[last_command] = vmalloc (1);
1407          commands[last_command][0] = '\0';
1408       } else if (0 == strncmp(argv[i], "-", 1)) {
1409          fprintf (stderr, "unknown or invalid argument %s\n", argv[i]);
1410          arg_errors++;
1411       } else {
1412          int len;
1413          if (last_command == -1) {
1414             /* only one command, no -c command indicator */
1415             last_command++;
1416             commands[last_command] = vmalloc (1);
1417             commands[last_command][0] = '\0';
1418          }
1419          len = strlen(commands[last_command]);
1420          commands[last_command] = vrealloc (commands[last_command],
1421                                             len + 1 + strlen(argv[i]) + 1);
1422          if (len > 0)
1423             strcat (commands[last_command], " ");
1424          strcat (commands[last_command], argv[i]);
1425          if (packet_len_for_command(commands[last_command]) > PBUFSIZ) {
1426             fprintf (stderr, "command %s too long\n", commands[last_command]);
1427             arg_errors++;
1428          }
1429 
1430       }
1431    }
1432 
1433    if (vgdb_prefix == NULL)
1434       vgdb_prefix = vgdb_prefix_default();
1435 
1436    if (isatty(0)
1437        && !show_shared_mem
1438        && !show_list
1439        && int_port == 0
1440        && last_command == -1) {
1441       arg_errors++;
1442       fprintf (stderr,
1443                "Using vgdb standalone implies to give -D or -l or a COMMAND\n");
1444    }
1445 
1446    if (show_shared_mem && show_list) {
1447       arg_errors++;
1448       fprintf (stderr,
1449                "Can't use both -D and -l options\n");
1450    }
1451 
1452    if (max_invoke_ms > 0
1453        && cmd_time_out != NEVER
1454        && (cmd_time_out * 1000) <= max_invoke_ms) {
1455       arg_errors++;
1456       fprintf (stderr,
1457                "--max-invoke-ms must be < --cmd-time-out * 1000\n");
1458    }
1459 
1460    if (show_list && arg_pid != -1) {
1461       arg_errors++;
1462       fprintf (stderr,
1463                "Can't use both --pid and -l options\n");
1464    }
1465 
1466    if (int_port > 0 && last_command != -1) {
1467       arg_errors++;
1468       fprintf (stderr,
1469                "Can't use --port to send commands\n");
1470    }
1471 
1472    if (arg_errors > 0) {
1473       fprintf (stderr, "args error. Try `vgdb --help` for more information\n");
1474       exit(1);
1475    }
1476 
1477    *p_show_shared_mem = show_shared_mem;
1478    *p_show_list = show_list;
1479    *p_arg_pid = arg_pid;
1480    *p_check_trials = check_trials;
1481    *p_port = int_port;
1482    *p_last_command = last_command;
1483 }
1484 
main(int argc,char ** argv)1485 int main(int argc, char** argv)
1486 {
1487    int i;
1488    int pid;
1489 
1490    Bool show_shared_mem;
1491    Bool show_list;
1492    int arg_pid;
1493    int check_trials;
1494    int in_port;
1495    int last_command;
1496    char *commands[argc]; // we will never have more commands than args.
1497 
1498    parse_options(argc, argv,
1499                  &show_shared_mem,
1500                  &show_list,
1501                  &arg_pid,
1502                  &check_trials,
1503                  &in_port,
1504                  &last_command,
1505                  commands);
1506 
1507    /* when we are working as a relay for gdb, handle some signals by
1508       only reporting them (according to debug level). Also handle these
1509       when ptrace will be used: vgdb must clean up the ptrace effect before
1510       dying. */
1511    if (max_invoke_ms > 0 || last_command == -1)
1512       install_handlers();
1513 
1514    pid = search_arg_pid (arg_pid, check_trials, show_list);
1515 
1516    prepare_fifos_and_shared_mem(pid);
1517 
1518    if (in_port > 0)
1519       wait_for_gdb_connect(in_port);
1520 
1521    if (show_shared_mem) {
1522       fprintf(stderr,
1523               "vgdb %d "
1524               "written_by_vgdb %d "
1525               "seen_by_valgrind %d\n"
1526               "vgdb pid %d\n",
1527               VS_vgdb_pid,
1528               VS_written_by_vgdb,
1529               VS_seen_by_valgrind,
1530               VS_vgdb_pid);
1531       exit (0);
1532    }
1533 
1534    if (last_command >= 0) {
1535       standalone_send_commands(pid, last_command, commands);
1536    } else {
1537       gdb_relay(pid);
1538    }
1539 
1540 
1541    free (from_gdb_to_pid);
1542    free (to_gdb_from_pid);
1543    free (shared_mem);
1544 
1545    for (i = 0; i <= last_command; i++)
1546       free (commands[i]);
1547    return 0;
1548 }
1549