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(VGPV_arm_linux_android) \
686     || defined(VGPV_x86_linux_android) \
687     || defined(VGPV_mips32_linux_android) \
688     || defined(VGPV_arm64_linux_android)
689       /* Android has no pthread_cancel. As it also does not have
690          an invoker implementation, there is no need for cleanup action.
691          So, we just do nothing. */
692       DEBUG(1, "sigalrm received, no action on android\n");
693 #else
694       /* Note: we cannot directly invoke restore_and_detach : this must
695          be done by the thread that has attached.
696          We have in this thread pushed a cleanup handler that will
697          cleanup what is needed. */
698       DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n");
699       pthread_cancel(invoke_gdbserver_in_valgrind_thread);
700 #endif
701    } else {
702       ERROR(0, "unexpected signal %d\n", signum);
703    }
704 }
705 
706 /* install the signal handlers allowing e.g. vgdb to cleanup in
707    case of termination. */
708 static
install_handlers(void)709 void install_handlers(void)
710 {
711    struct sigaction action, oldaction;
712 
713    action.sa_handler = received_signal;
714    sigemptyset(&action.sa_mask);
715    action.sa_flags = 0;
716 
717    /* SIGINT: when user types C-c in gdb, this sends
718       a SIGINT to vgdb + causes a character to be sent to remote gdbserver.
719       The later is enough to wakeup the valgrind process. */
720    if (sigaction(SIGINT, &action, &oldaction) != 0)
721       XERROR(errno, "vgdb error sigaction SIGINT\n");
722    /* We might do something more intelligent than just
723       reporting this SIGINT E.g. behave similarly to the gdb: two
724       control-C without feedback from the debugged process would
725       mean to stop debugging it. */
726 
727    /* SIGUSR1: this is used to facilitate automatic testing.  When
728       vgdb receives this signal, it will simulate the user typing C-c. */
729    if (sigaction(SIGUSR1, &action, &oldaction) != 0)
730       XERROR(errno, "vgdb error sigaction SIGUSR1\n");
731 
732 
733    /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb
734       when detaching or similar. A clean shutdown will be done as both
735       the read and write side will detect an end of file. */
736    if (sigaction(SIGTERM, &action, &oldaction) != 0)
737       XERROR(errno, "vgdb error sigaction SIGTERM\n");
738 
739    /* SIGPIPE: can receive this signal when gdb detaches or kill the
740       process debugged: gdb will close its pipes to vgdb. vgdb
741       must resist to this signal to allow a clean shutdown. */
742    if (sigaction(SIGPIPE, &action, &oldaction) != 0)
743       XERROR(errno, "vgdb error sigaction SIGPIPE\n");
744 
745    /* SIGALRM: in case invoke thread is blocked, alarm is used
746       to cleanup.  */
747    if (sigaction(SIGALRM, &action, &oldaction) != 0)
748       XERROR(errno, "vgdb error sigaction SIGALRM\n");
749 
750    /* unmask all signals, in case the process that launched vgdb
751       masked some. */
752    if (sigprocmask(SIG_SETMASK, &action.sa_mask, NULL) != 0)
753       XERROR(errno, "vgdb error sigprocmask");
754 }
755 
756 /* close the FIFOs provided connections, terminate the invoker thread.  */
757 static
close_connection(int to_pid,int from_pid)758 void close_connection(int to_pid, int from_pid)
759 {
760    DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n",
761          sigint, sigterm, sighup, sigpipe);
762    /* Note that we do not forward sigterm to the valgrind process:
763       a sigterm signal is (probably) received from gdb if the user wants to
764       kill the debugged process. The kill instruction has been given to
765       the valgrind process, which should execute a clean exit. */
766 
767    /* We first close the connection to pid. The pid will then
768       terminates its gdbserver work. We keep the from pid
769       fifo opened till the invoker thread is finished.
770       This allows the gdbserver to finish sending its last reply. */
771    if (close(to_pid) != 0)
772       ERROR(errno, "close to_pid\n");
773 
774    /* if there is a task that was busy trying to wake up valgrind
775       process, we wait for it to be terminated otherwise threads
776       in the valgrind process can stay stopped if vgdb main
777       exits before the invoke thread had time to detach from
778       all valgrind threads. */
779    if (max_invoke_ms > 0 || cmd_time_out != NEVER) {
780       int join;
781 
782       /* It is surprisingly complex to properly shutdown or exit the
783          valgrind process in which gdbserver has been invoked through
784          ptrace.  In the normal case (gdb detaches from the process,
785          or process is continued), the valgrind process will reach the
786          breakpoint place.  Using ptrace, vgdb will ensure the
787          previous activity of the process is resumed (e.g. restart a
788          blocking system call).  The special case is when gdb asks the
789          valgrind process to exit (using either the "kill" command or
790          "monitor exit").  In such a case, the valgrind process will
791          call exit.  But a ptraced process will be blocked in exit,
792          waiting for the ptracing process to detach or die. vgdb
793          cannot detach unconditionally as otherwise, in the normal
794          case, the valgrind process would stop abnormally with SIGSTOP
795          (as vgdb would not be there to catch it). vgdb can also not
796          die unconditionally otherwise again, similar problem.  So, we
797          assume that most of the time, we arrive here in the normal
798          case, and so, the breakpoint has been encountered by the
799          valgrind process, so the invoker thread will exit and the
800          join will succeed.  For the "kill" case, we cause an alarm
801          signal to be sent after a few seconds. This means that in the
802          normal case, the gdbserver code in valgrind process must have
803          returned the control in less than the alarm nr of seconds,
804          otherwise, valgrind will stop abnormally with SIGSTOP. */
805       (void) alarm(3);
806 
807       DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n");
808       join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL);
809       if (join != 0)
810          XERROR
811             (join,
812              "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n");
813    }
814    if (close(from_pid) != 0)
815       ERROR(errno, "close from_pid\n");
816 }
817 
818 /* Relay data between gdb and Valgrind gdbserver, till EOF or an
819    error is encountered. */
820 static
gdb_relay(int pid)821 void gdb_relay(int pid)
822 {
823    int from_pid = -1; /* fd to read from pid */
824    int to_pid = -1; /* fd to write to pid */
825 
826    int shutdown_loop = 0;
827    fprintf(stderr, "relaying data between gdb and process %d\n", pid);
828    fflush(stderr);
829 
830    if (max_invoke_ms > 0)
831       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
832                      invoke_gdbserver_in_valgrind, (void *) &pid);
833    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
834    acquire_lock(shared_mem_fd, pid);
835 
836    from_pid = open_fifo(to_gdb_from_pid, O_RDONLY|O_NONBLOCK,
837                         "read mode from pid");
838 
839    sigusr1_fd = to_pid; /* allow simulating user typing control-c */
840 
841    while (1) {
842       ConnectionKind ck;
843       int ret;
844       struct pollfd pollfds[NumConnectionKind];
845 
846       /* watch data written by gdb, watch POLLERR on both gdb fd */
847       pollfds[FROM_GDB].fd = from_gdb;
848       pollfds[FROM_GDB].events = POLLIN;
849       pollfds[FROM_GDB].revents = 0;
850       pollfds[TO_GDB].fd = to_gdb;
851       pollfds[TO_GDB].events = 0;
852       pollfds[TO_GDB].revents = 0;
853 
854       /* watch data written by pid, watch POLLERR on both pid fd */
855       pollfds[FROM_PID].fd = from_pid;
856       pollfds[FROM_PID].events = POLLIN;
857       pollfds[FROM_PID].revents = 0;
858       pollfds[TO_PID].fd = to_pid;
859       pollfds[TO_PID].events = 0;
860       pollfds[TO_PID].revents = 0;
861 
862       ret = poll(pollfds,
863                  NumConnectionKind,
864                  (shutting_down ?
865                   1 /* one second */
866                   : -1 /* infinite */));
867       DEBUG(2, "poll ret %d errno %d\n", ret, errno);
868 
869       /* check for unexpected error */
870       if (ret <= 0 && errno != EINTR) {
871          ERROR(errno, "unexpected poll ret %d\n", ret);
872          shutting_down = True;
873          break;
874       }
875 
876       /* check for data to read */
877       for (ck = 0; ck < NumConnectionKind; ck ++) {
878          if (pollfds[ck].revents & POLLIN) {
879             switch (ck) {
880             case FROM_GDB:
881                if (!read_from_gdb_write_to_pid(to_pid))
882                   shutting_down = True;
883                break;
884             case FROM_PID:
885                if (!read_from_pid_write_to_gdb(from_pid))
886                   shutting_down = True;
887                break;
888             default: XERROR(0, "unexpected POLLIN on %s\n",
889                                ppConnectionKind(ck));
890             }
891          }
892       }
893 
894       /* check for an fd being in error condition */
895       for (ck = 0; ck < NumConnectionKind; ck ++) {
896          if (pollfds[ck].revents & POLLERR) {
897             DEBUG(1, "connection %s fd %d POLLERR error condition\n",
898                      ppConnectionKind(ck), pollfds[ck].fd);
899             invoker_valgrind_dying();
900             shutting_down = True;
901          }
902          if (pollfds[ck].revents & POLLHUP) {
903             DEBUG(1, "connection %s fd %d POLLHUP error condition\n",
904                   ppConnectionKind(ck), pollfds[ck].fd);
905             invoker_valgrind_dying();
906             shutting_down = True;
907          }
908          if (pollfds[ck].revents & POLLNVAL) {
909             DEBUG(1, "connection %s fd %d POLLNVAL error condition\n",
910                   ppConnectionKind(ck), pollfds[ck].fd);
911             invoker_valgrind_dying();
912             shutting_down = True;
913          }
914       }
915 
916       if (shutting_down) {
917          /* we let some time to the final packets to be transferred */
918          shutdown_loop++;
919          if (shutdown_loop > 3)
920             break;
921       }
922    }
923    close_connection(to_pid, from_pid);
924 }
925 
packet_len_for_command(char * cmd)926 static int packet_len_for_command(char *cmd)
927 {
928    /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc      */
929    return                          7+     2*strlen(cmd)             +3  + 1;
930 }
931 
932 /* hyper-minimal protocol implementation that
933    sends the provided commands (using qRcmd packets)
934    and read and display their replies. */
935 static
standalone_send_commands(int pid,int last_command,char * commands[])936 void standalone_send_commands(int pid,
937                               int last_command,
938                               char *commands[] )
939 {
940    int from_pid = -1; /* fd to read from pid */
941    int to_pid = -1; /* fd to write to pid */
942 
943    int i;
944    int hi;
945    char hex[3];
946    unsigned char cksum;
947    char *hexcommand;
948    char buf[PBUFSIZ+1]; // +1 for trailing \0
949    int buflen;
950    int nc;
951 
952 
953    if (max_invoke_ms > 0 || cmd_time_out != NEVER)
954       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
955                      invoke_gdbserver_in_valgrind, (void *) &pid);
956 
957    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
958    acquire_lock(shared_mem_fd, pid);
959 
960    /* first send a C-c \003 to pid, so that it wakes up the process
961       After that, we can open the fifo from the pid in read mode
962       We then start to wait for packets (normally first a resume reply)
963       At that point, we send our command and expect replies */
964    buf[0] = '\003';
965    i = 0;
966    while (!write_buf(to_pid, buf, 1,
967                      "write \\003 to wake up", /* notify */ True)) {
968       /* If write fails, retries up to 10 times every 0.5 seconds
969          This aims at solving the race condition described in
970          remote-utils.c remote_finish function. */
971       usleep(500*1000);
972       i++;
973       if (i >= 10)
974          XERROR(errno, "failed to send wake up char after 10 trials\n");
975    }
976    from_pid = open_fifo(to_gdb_from_pid, O_RDONLY,
977                         "read cmd result from pid");
978 
979    /* Enable no ack mode. */
980    write_buf(to_pid, "$QStartNoAckMode#b0", 19, "write start no ack mode",
981              /* notify */ True);
982    buflen = getpkt(buf, from_pid, to_pid);
983    if (buflen != 2 || strcmp(buf, "OK") != 0) {
984       if (buflen != 2)
985          ERROR(0, "no ack mode: unexpected buflen %d\n", buflen);
986       else
987          ERROR(0, "no ack mode: unexpected packet %s\n", buf);
988    }
989 
990    for (nc = 0; nc <= last_command; nc++) {
991       fprintf(stderr, "sending command %s to pid %d\n", commands[nc], pid);
992       fflush(stderr);
993 
994       /* prepare hexcommand $qRcmd,xxxx....................xx#cc      */
995       hexcommand = vmalloc(packet_len_for_command(commands[nc]));
996       hexcommand[0] = 0;
997       strcat(hexcommand, "$qRcmd,");
998       for (i = 0; i < strlen(commands[nc]); i++) {
999          sprintf(hex, "%02x", (unsigned char) commands[nc][i]);
1000          // Need to use unsigned char, to avoid sign extension.
1001          strcat(hexcommand, hex);
1002       }
1003       /* checksum (but without the $) */
1004       cksum = 0;
1005       for (hi = 1; hi < strlen(hexcommand); hi++)
1006          cksum+=hexcommand[hi];
1007       strcat(hexcommand, "#");
1008       sprintf(hex, "%02x", cksum);
1009       strcat(hexcommand, hex);
1010       write_buf(to_pid, hexcommand, strlen(hexcommand),
1011                 "writing hex command to pid", /* notify */ True);
1012 
1013       /* we exit of the below loop explicitly when the command has
1014          been handled or because a signal handler will set
1015          shutting_down. */
1016       while (!shutting_down) {
1017          buflen = getpkt(buf, from_pid, to_pid);
1018          if (buflen < 0) {
1019             ERROR(0, "error reading packet\n");
1020             if (buflen == -2)
1021                invoker_valgrind_dying();
1022             break;
1023          }
1024          if (strlen(buf) == 0) {
1025             DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n");
1026             break;
1027          }
1028          if (strcmp(buf, "OK") == 0) {
1029             DEBUG(1, "OK packet rcvd\n");
1030             break;
1031          }
1032          if (buf[0] == 'E') {
1033             DEBUG(0,
1034                   "E NN error packet rcvd: %s (unknown monitor command?)\n",
1035                   buf);
1036             break;
1037          }
1038          if (buf[0] == 'W') {
1039             DEBUG(0, "W stopped packet rcvd: %s\n", buf);
1040             break;
1041          }
1042          if (buf[0] == 'T') {
1043             DEBUG(1, "T resume reply packet received: %s\n", buf);
1044             continue;
1045          }
1046 
1047          /* must be here an O packet with hex encoded string reply
1048             => decode and print it */
1049          if (buf[0] != 'O') {
1050             DEBUG(0, "expecting O packet, received: %s\n", buf);
1051             continue;
1052          }
1053          {
1054             char buf_print[buflen/2 + 1];
1055             for (i = 1; i < buflen; i = i + 2)
1056                buf_print[i/2] = (fromhex(*(buf+i)) << 4)
1057                      + fromhex(*(buf+i+1));
1058             buf_print[buflen/2] = 0;
1059             printf("%s", buf_print);
1060             fflush(stdout);
1061          }
1062       }
1063       free(hexcommand);
1064    }
1065    shutting_down = True;
1066 
1067    close_connection(to_pid, from_pid);
1068 }
1069 
1070 /* report to user the existence of a vgdb-able valgrind process
1071    with given pid.
1072    Note: this function does not use XERROR if an error is encountered
1073    while producing the command line for pid, as this is not critical
1074    and at least on MacOS, reading cmdline is not available. */
1075 static
report_pid(int pid,Bool on_stdout)1076 void report_pid(int pid, Bool on_stdout)
1077 {
1078    char cmdline_file[50];   // large enough
1079    int fd, i;
1080    FILE *out = on_stdout ? stdout : stderr;
1081 
1082    fprintf(out, "use --pid=%d for ", pid);
1083 
1084    sprintf(cmdline_file, "/proc/%d/cmdline", pid);
1085    fd = open(cmdline_file, O_RDONLY);
1086    if (fd == -1) {
1087       DEBUG(1, "error opening cmdline file %s %s\n",
1088             cmdline_file, strerror(errno));
1089       fprintf(out, "(could not open process command line)\n");
1090    } else {
1091       char cmdline[100];
1092       ssize_t sz;
1093       while ((sz = read(fd, cmdline, sizeof cmdline - 1)) != 0) {
1094          for (i = 0; i < sz; i++)
1095             if (cmdline[i] == 0)
1096                cmdline[i] = ' ';
1097          cmdline[sz] = 0;
1098          fprintf(out, "%s", cmdline);
1099       }
1100       if (sz == -1) {
1101          DEBUG(1, "error reading cmdline file %s %s\n",
1102                cmdline_file, strerror(errno));
1103          fprintf(out, "(error reading process command line)");
1104       }
1105       fprintf(out, "\n");
1106       close(fd);
1107    }
1108    fflush(out);
1109 }
1110 
1111 static
usage(void)1112 void usage(void)
1113 {
1114    fprintf(stderr,
1115 "Usage: vgdb [OPTION]... [[-c] COMMAND]...\n"
1116 "vgdb (valgrind gdb) has two usages\n"
1117 "  1. standalone to send monitor commands to a Valgrind gdbserver.\n"
1118 "     The OPTION(s) must be followed by the command to send\n"
1119 "     To send more than one command, separate the commands with -c\n"
1120 "  2. relay application between gdb and a Valgrind gdbserver.\n"
1121 "     Only OPTION(s) can be given.\n"
1122 "\n"
1123 " OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n"
1124 "             [--wait=<number>] [--max-invoke-ms=<number>]\n"
1125 "             [--port=<portnr>\n"
1126 "             [--cmd-time-out=<number>] [-l] [-D] [-d]\n"
1127 "             \n"
1128 "  --pid arg must be given if multiple Valgrind gdbservers are found.\n"
1129 "  --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n"
1130 "      if you want to change the prefix (default %s) for the FIFOs communication\n"
1131 "      between the Valgrind gdbserver and vgdb.\n"
1132 "  --wait (default 0) tells vgdb to check during the specified number\n"
1133 "      of seconds if a Valgrind gdbserver can be found.\n"
1134 "  --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n"
1135 "      will force the invocation of the Valgrind gdbserver (if the Valgrind\n"
1136 "         process is blocked in a system call).\n"
1137 "  --port instructs vgdb to listen for gdb on the specified port nr.\n"
1138 "  --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n"
1139 "     gdbserver has not processed a command after number seconds\n"
1140 "  -l  arg tells to show the list of running Valgrind gdbserver and then exit.\n"
1141 "  -D  arg tells to show shared mem status and then exit.\n"
1142 "  -d  arg tells to show debug info. Multiple -d args for more debug info\n"
1143 "\n"
1144 "  -h --help shows this message\n"
1145 "  To get help from the Valgrind gdbserver, use vgdb help\n"
1146 "\n", vgdb_prefix_default()
1147            );
1148    invoker_restrictions_msg();
1149 }
1150 
1151 /* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated.
1152                  and then exits.
1153 
1154    else if arg_pid == -1, waits maximum check_trials seconds to discover
1155    a valgrind pid appearing.
1156 
1157    Otherwise verify arg_pid is valid and corresponds to a Valgrind process
1158    with gdbserver activated.
1159 
1160    Returns the pid to work with
1161    or exits in case of error (e.g. no pid found corresponding to arg_pid */
1162 
1163 static
search_arg_pid(int arg_pid,int check_trials,Bool show_list)1164 int search_arg_pid(int arg_pid, int check_trials, Bool show_list)
1165 {
1166    int i;
1167    int pid = -1;
1168 
1169    if (arg_pid == 0 || arg_pid < -1) {
1170       fprintf(stderr, "vgdb error: invalid pid %d given\n", arg_pid);
1171       exit(1);
1172    } else {
1173       /* search for a matching named fifo.
1174          If we have been given a pid, we will check that the matching FIFO is
1175          there (or wait the nr of check_trials for this to appear).
1176          If no pid has been given, then if we find only one FIFO,
1177          we will use this to build the pid to use.
1178          If we find multiple processes with valid FIFO, we report them and will
1179          exit with an error. */
1180       DIR *vgdb_dir;
1181       char *vgdb_dir_name = vmalloc(strlen (vgdb_prefix) + 3);
1182       struct dirent *f;
1183       int is;
1184       int nr_valid_pid = 0;
1185       const char *suffix = "-from-vgdb-to-"; /* followed by pid */
1186       char *vgdb_format = vmalloc(strlen(vgdb_prefix) + strlen(suffix) + 1);
1187 
1188       strcpy(vgdb_format, vgdb_prefix);
1189       strcat(vgdb_format, suffix);
1190 
1191       if (strchr(vgdb_prefix, '/') != NULL) {
1192          strcpy(vgdb_dir_name, vgdb_prefix);
1193          for (is = strlen(vgdb_prefix) - 1; is >= 0; is--)
1194             if (vgdb_dir_name[is] == '/') {
1195                vgdb_dir_name[is+1] = '\0';
1196                break;
1197             }
1198       } else {
1199          strcpy(vgdb_dir_name, "");
1200       }
1201 
1202       DEBUG(1, "searching pid in directory %s format %s\n",
1203             vgdb_dir_name, vgdb_format);
1204 
1205       /* try to find FIFOs with valid pid.
1206          On exit of the loop, pid is set to:
1207          the last pid found if show_list (or -1 if no process was listed)
1208          -1 if no FIFOs matching a running process is found
1209          -2 if multiple FIFOs of running processes are found
1210          otherwise it is set to the (only) pid found that can be debugged
1211       */
1212       for (i = 0; i < check_trials; i++) {
1213          DEBUG(1, "check_trial %d \n", i);
1214          if (i > 0)
1215            /* wait one second before checking again */
1216            sleep(1);
1217 
1218          vgdb_dir = opendir(strlen(vgdb_dir_name) ? vgdb_dir_name : "./");
1219          if (vgdb_dir == NULL)
1220             XERROR(errno,
1221                    "vgdb error: opening directory %s searching vgdb fifo\n",
1222                    vgdb_dir_name);
1223 
1224          errno = 0; /* avoid complain if vgdb_dir is empty */
1225          while ((f = readdir(vgdb_dir))) {
1226             struct stat st;
1227             char pathname[strlen(vgdb_dir_name) + strlen(f->d_name) + 1];
1228             char *wrongpid;
1229             int newpid;
1230 
1231             strcpy(pathname, vgdb_dir_name);
1232             strcat(pathname, f->d_name);
1233             DEBUG(3, "checking pathname is FIFO %s\n", pathname);
1234             if (stat(pathname, &st) != 0) {
1235                if (debuglevel >= 3)
1236                   ERROR(errno, "vgdb error: stat %s searching vgdb fifo\n",
1237                         pathname);
1238             } else if (S_ISFIFO(st.st_mode)) {
1239                DEBUG(3, "trying FIFO %s\n", pathname);
1240                if (strncmp(pathname, vgdb_format,
1241                            strlen(vgdb_format)) == 0) {
1242                   newpid = strtol(pathname + strlen(vgdb_format),
1243                                   &wrongpid, 10);
1244                   if (*wrongpid == '-' && newpid > 0
1245                       && kill(newpid, 0) == 0) {
1246                      nr_valid_pid++;
1247                      if (show_list) {
1248                         report_pid(newpid, /*on_stdout*/ True);
1249                         pid = newpid;
1250                      } else if (arg_pid != -1) {
1251                         if (arg_pid == newpid) {
1252                            pid = newpid;
1253                         }
1254                      } else if (nr_valid_pid > 1) {
1255                         if (nr_valid_pid == 2) {
1256                            fprintf
1257                               (stderr,
1258                                "no --pid= arg given"
1259                                " and multiple valgrind pids found:\n");
1260                            report_pid(pid, /*on_stdout*/ False);
1261                         }
1262                         pid = -2;
1263                         report_pid(newpid, /*on_stdout*/ False);
1264                      } else {
1265                         pid = newpid;
1266                      }
1267                   }
1268                }
1269             }
1270             errno = 0; /* avoid complain if at the end of vgdb_dir */
1271          }
1272          if (f == NULL && errno != 0)
1273             XERROR(errno, "vgdb error: reading directory %s for vgdb fifo\n",
1274                    vgdb_dir_name);
1275 
1276          closedir(vgdb_dir);
1277          if (pid != -1)
1278             break;
1279       }
1280 
1281       free(vgdb_dir_name);
1282       free(vgdb_format);
1283    }
1284 
1285    if (show_list) {
1286       exit(1);
1287    } else if (pid == -1) {
1288       if (arg_pid == -1)
1289          fprintf(stderr, "vgdb error: no FIFO found and no pid given\n");
1290       else
1291          fprintf(stderr, "vgdb error: no FIFO found matching pid %d\n",
1292                  arg_pid);
1293       exit(1);
1294    }
1295    else if (pid == -2) {
1296       /* no arg_pid given, multiple FIFOs found */
1297       exit(1);
1298    }
1299    else {
1300       return pid;
1301    }
1302 }
1303 
1304 /* return true if the numeric value of an option of the
1305    form --xxxxxxxxx=<number> could properly be extracted
1306    from arg. If True is returned, *value contains the
1307    extracted value.*/
1308 static
numeric_val(char * arg,int * value)1309 Bool numeric_val(char* arg, int *value)
1310 {
1311    const char *eq_pos = strchr(arg, '=');
1312    char *wrong;
1313    long long int long_value;
1314 
1315    if (eq_pos == NULL)
1316       return False;
1317 
1318    long_value = strtoll(eq_pos+1, &wrong, 10);
1319    if (long_value < 0 || long_value > INT_MAX)
1320       return False;
1321    if (*wrong)
1322       return False;
1323 
1324    *value = (int) long_value;
1325    return True;
1326 }
1327 
1328 /* true if arg matches the provided option */
1329 static
is_opt(char * arg,const char * option)1330 Bool is_opt(char* arg, const char *option)
1331 {
1332    int option_len = strlen(option);
1333    if (option[option_len-1] == '=')
1334       return (0 == strncmp(option, arg, option_len));
1335    else
1336       return (0 == strcmp(option, arg));
1337 }
1338 
1339 /* Parse command lines options. If error(s), exits.
1340    Otherwise returns the options in *p_... args.
1341    commands must be big enough for the commands extracted from argv.
1342    On return, *p_last_command gives the position in commands where
1343    the last command has been allocated (using vmalloc). */
1344 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[])1345 void parse_options(int argc, char** argv,
1346                    Bool *p_show_shared_mem,
1347                    Bool *p_show_list,
1348                    int *p_arg_pid,
1349                    int *p_check_trials,
1350                    int *p_port,
1351                    int *p_last_command,
1352                    char *commands[])
1353 {
1354    Bool show_shared_mem = False;
1355    Bool show_list = False;
1356    int arg_pid = -1;
1357    int check_trials = 1;
1358    int last_command = -1;
1359    int int_port = 0;
1360 
1361    int i;
1362    int arg_errors = 0;
1363 
1364    for (i = 1; i < argc; i++) {
1365       if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) {
1366          usage();
1367          exit(0);
1368       } else if (is_opt(argv[i], "-d")) {
1369          debuglevel++;
1370       } else if (is_opt(argv[i], "-D")) {
1371          show_shared_mem = True;
1372       } else if (is_opt(argv[i], "-l")) {
1373          show_list = True;
1374       } else if (is_opt(argv[i], "--pid=")) {
1375          int newpid;
1376          if (!numeric_val(argv[i], &newpid)) {
1377             fprintf(stderr, "invalid --pid argument %s\n", argv[i]);
1378             arg_errors++;
1379          } else if (arg_pid != -1) {
1380             fprintf(stderr, "multiple --pid arguments given\n");
1381             arg_errors++;
1382          } else {
1383             arg_pid = newpid;
1384          }
1385       } else if (is_opt(argv[i], "--wait=")) {
1386          if (!numeric_val(argv[i], &check_trials)) {
1387             fprintf(stderr, "invalid --wait argument %s\n", argv[i]);
1388             arg_errors++;
1389          }
1390       } else if (is_opt(argv[i], "--max-invoke-ms=")) {
1391          if (!numeric_val(argv[i], &max_invoke_ms)) {
1392             fprintf(stderr, "invalid --max-invoke-ms argument %s\n", argv[i]);
1393             arg_errors++;
1394          }
1395       } else if (is_opt(argv[i], "--cmd-time-out=")) {
1396          if (!numeric_val(argv[i], &cmd_time_out)) {
1397             fprintf(stderr, "invalid --cmd-time-out argument %s\n", argv[i]);
1398             arg_errors++;
1399          }
1400       } else if (is_opt(argv[i], "--port=")) {
1401          if (!numeric_val(argv[i], &int_port)) {
1402             fprintf(stderr, "invalid --port argument %s\n", argv[i]);
1403             arg_errors++;
1404          }
1405       } else if (is_opt(argv[i], "--vgdb-prefix=")) {
1406          vgdb_prefix = argv[i] + 14;
1407       } else if (is_opt(argv[i], "-c")) {
1408          last_command++;
1409          commands[last_command] = vmalloc(1);
1410          commands[last_command][0] = '\0';
1411       } else if (0 == strncmp(argv[i], "-", 1)) {
1412          fprintf(stderr, "unknown or invalid argument %s\n", argv[i]);
1413          arg_errors++;
1414       } else {
1415          int len;
1416          if (last_command == -1) {
1417             /* only one command, no -c command indicator */
1418             last_command++;
1419             commands[last_command] = vmalloc(1);
1420             commands[last_command][0] = '\0';
1421          }
1422          len = strlen(commands[last_command]);
1423          commands[last_command] = vrealloc(commands[last_command],
1424                                            len + 1 + strlen(argv[i]) + 1);
1425          if (len > 0)
1426             strcat(commands[last_command], " ");
1427          strcat(commands[last_command], argv[i]);
1428          if (packet_len_for_command(commands[last_command]) > PBUFSIZ) {
1429             fprintf(stderr, "command %s too long\n", commands[last_command]);
1430             arg_errors++;
1431          }
1432 
1433       }
1434    }
1435 
1436    if (vgdb_prefix == NULL)
1437       vgdb_prefix = vgdb_prefix_default();
1438 
1439    if (isatty(0)
1440        && !show_shared_mem
1441        && !show_list
1442        && int_port == 0
1443        && last_command == -1) {
1444       arg_errors++;
1445       fprintf(stderr,
1446               "Using vgdb standalone implies to give -D or -l or a COMMAND\n");
1447    }
1448 
1449    if (show_shared_mem && show_list) {
1450       arg_errors++;
1451       fprintf(stderr,
1452               "Can't use both -D and -l options\n");
1453    }
1454 
1455    if (max_invoke_ms > 0
1456        && cmd_time_out != NEVER
1457        && (cmd_time_out * 1000) <= max_invoke_ms) {
1458       arg_errors++;
1459       fprintf(stderr,
1460               "--max-invoke-ms must be < --cmd-time-out * 1000\n");
1461    }
1462 
1463    if (show_list && arg_pid != -1) {
1464       arg_errors++;
1465       fprintf(stderr,
1466               "Can't use both --pid and -l options\n");
1467    }
1468 
1469    if (int_port > 0 && last_command != -1) {
1470       arg_errors++;
1471       fprintf(stderr,
1472               "Can't use --port to send commands\n");
1473    }
1474 
1475    if (arg_errors > 0) {
1476       fprintf(stderr, "args error. Try `vgdb --help` for more information\n");
1477       exit(1);
1478    }
1479 
1480    *p_show_shared_mem = show_shared_mem;
1481    *p_show_list = show_list;
1482    *p_arg_pid = arg_pid;
1483    *p_check_trials = check_trials;
1484    *p_port = int_port;
1485    *p_last_command = last_command;
1486 }
1487 
main(int argc,char ** argv)1488 int main(int argc, char** argv)
1489 {
1490    int i;
1491    int pid;
1492 
1493    Bool show_shared_mem;
1494    Bool show_list;
1495    int arg_pid;
1496    int check_trials;
1497    int in_port;
1498    int last_command;
1499    char *commands[argc]; // we will never have more commands than args.
1500 
1501    parse_options(argc, argv,
1502                  &show_shared_mem,
1503                  &show_list,
1504                  &arg_pid,
1505                  &check_trials,
1506                  &in_port,
1507                  &last_command,
1508                  commands);
1509 
1510    /* when we are working as a relay for gdb, handle some signals by
1511       only reporting them (according to debug level). Also handle these
1512       when ptrace will be used: vgdb must clean up the ptrace effect before
1513       dying. */
1514    if (max_invoke_ms > 0 || last_command == -1)
1515       install_handlers();
1516 
1517    pid = search_arg_pid(arg_pid, check_trials, show_list);
1518 
1519    prepare_fifos_and_shared_mem(pid);
1520 
1521    if (in_port > 0)
1522       wait_for_gdb_connect(in_port);
1523 
1524    if (show_shared_mem) {
1525       fprintf(stderr,
1526               "vgdb %d "
1527               "written_by_vgdb %d "
1528               "seen_by_valgrind %d\n"
1529               "vgdb pid %d\n",
1530               VS_vgdb_pid,
1531               VS_written_by_vgdb,
1532               VS_seen_by_valgrind,
1533               VS_vgdb_pid);
1534       exit(0);
1535    }
1536 
1537    if (last_command >= 0) {
1538       standalone_send_commands(pid, last_command, commands);
1539    } else {
1540       gdb_relay(pid);
1541    }
1542 
1543 
1544    free(from_gdb_to_pid);
1545    free(to_gdb_from_pid);
1546    free(shared_mem);
1547 
1548    for (i = 0; i <= last_command; i++)
1549       free(commands[i]);
1550    return 0;
1551 }
1552