bool rargs(char **userspace_argv, struct s_argblk * argbuf) { char *ptr; /* Address of base of arg strings in user space */ char *up = (char *)userspace_argv; uint8_t c; uint8_t *bufp; argbuf->a_argc = 0; /* Store argc in argbuf */ bufp = argbuf->a_buf; while ((ptr = (char *) ugetp(up)) != NULL) { up += sizeof(uptr_t); ++(argbuf->a_argc); /* Store argc in argbuf. */ do { *bufp++ = c = ugetc(ptr++); if (bufp > argbuf->a_buf + 500) { udata.u_error = E2BIG; return true; // failed } } while (c); } argbuf->a_arglen = bufp - (uint8_t *)argbuf->a_buf; /*Store total string size. */ return false; // success }
bool rargs(char **userspace_argv, struct s_argblk * argbuf) { char *ptr; /* Address of base of arg strings in user space */ uint8_t c; uint8_t *bufp; int err; void *up = (void *)userspace_argv; argbuf->a_argc = 0; /* Store argc in argbuf */ bufp = argbuf->a_buf; while ((ptr = (char *) ugetp(up, &err)) != NULL) { up += sizeof(uptr_t); if (err) return true; ++(argbuf->a_argc); /* Store argc in argbuf. */ do { *bufp++ = c = ugetc(ptr++); if (bufp > argbuf->a_buf + ARGBUF_SIZE - 12) { udata.u_error = E2BIG; return true; // failed } } while (c); } /*Store total string size. */ argbuf->a_arglen = bufp - (uint8_t *)argbuf->a_buf; /* Align */ if (argbuf->a_arglen & 1) argbuf->a_arglen++ ; /* Success */ return false; }