|
11 | 11 | #define I(x) r_cons_singleton ()->x
|
12 | 12 |
|
13 | 13 | static char *strchr_ns(char *s, const char ch) {
|
14 |
| - char *p = strchr (s, ch); |
15 |
| - if (p && p > s) { |
16 |
| - char *prev = p - 1; |
17 |
| - if (*prev == '\\') { |
18 |
| - memmove (prev, p, strlen (p) + 1); |
19 |
| - return strchr_ns (p, ch); |
| 14 | + if (!s) { |
| 15 | + return NULL; |
| 16 | + } |
| 17 | + |
| 18 | + char *p; |
| 19 | + while ((p = strchr (s, ch)) != NULL) { |
| 20 | + if (p > s && *(p - 1) == '\\') { |
| 21 | + memmove (p - 1, p, strlen (p) + 1); |
| 22 | + s = p; |
| 23 | + } else { |
| 24 | + return p; |
20 | 25 | }
|
21 | 26 | }
|
22 |
| - return p; |
| 27 | + return NULL; |
23 | 28 | }
|
24 | 29 |
|
25 | 30 | static void r_cons_grep_word_free(RConsGrepWord *gw) {
|
@@ -369,8 +374,9 @@ R_API void r_cons_grep_expression(const char *str) {
|
369 | 374 | if (!grep->str) {
|
370 | 375 | grep->str = (char *)strdup (ptr);
|
371 | 376 | } else {
|
372 |
| - grep->str = r_str_append (grep->str, ","); |
373 |
| - grep->str = r_str_append (grep->str, ptr); |
| 377 | + char *s = r_str_newf (",%s", ptr); |
| 378 | + grep->str = r_str_append (grep->str, s); |
| 379 | + free (s); |
374 | 380 | }
|
375 | 381 | do {
|
376 | 382 | optr = ptr;
|
@@ -483,7 +489,14 @@ static int cmp(const void *a, const void *b) {
|
483 | 489 | const char *ca = r_str_trim_head_ro (a);
|
484 | 490 | const char *cb = r_str_trim_head_ro (b);
|
485 | 491 | if (!a || !b) {
|
486 |
| - return (int) (size_t) ((char *) a - (char *) b); |
| 492 | + ptrdiff_t diff = (char*)a - (char*)b; |
| 493 | + if (diff > INT_MAX) { |
| 494 | + return INT_MAX; |
| 495 | + } |
| 496 | + if (diff < INT_MIN) { |
| 497 | + return INT_MIN; |
| 498 | + } |
| 499 | + return (int)diff; |
487 | 500 | }
|
488 | 501 | RConsContext *ctx = r_cons_context ();
|
489 | 502 | if (ctx->sorted_column > 0) {
|
@@ -730,6 +743,9 @@ R_API void r_cons_grepbuf(void) {
|
730 | 743 | char *sbuf = r_str_ndup (cons->context->buffer, cons->context->buffer_len);
|
731 | 744 | if (sbuf) {
|
732 | 745 | char *res = r_str_tokenize_json (sbuf);
|
| 746 | + if (!res) { |
| 747 | + return; |
| 748 | + } |
733 | 749 | char *nres = r_print_json_indent (res, I(context->color_mode), " ", NULL);
|
734 | 750 | free (res);
|
735 | 751 | res = r_str_newf ("%s\n", nres);
|
|
0 commit comments