suricata
util-misc.c
Go to the documentation of this file.
1 /* Copyright (C) 2007-2010 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Anoop Saldanha <anoopsaldanha@gmail.com>
22  */
23 
24 #include "suricata-common.h"
25 #include "config.h"
26 #include "suricata.h"
27 #include "util-byte.h"
28 #include "util-debug.h"
29 #include "util-unittest.h"
30 #include "util-misc.h"
31 
32 #define PARSE_REGEX "^\\s*(\\d+(?:.\\d+)?)\\s*([a-zA-Z]{2})?\\s*$"
33 static pcre *parse_regex = NULL;
34 static pcre_extra *parse_regex_study = NULL;
35 
36 void ParseSizeInit(void)
37 {
38  const char *eb = NULL;
39  int eo;
40  int opts = 0;
41 
42  parse_regex = pcre_compile(PARSE_REGEX, opts, &eb, &eo, NULL);
43  if (parse_regex == NULL) {
44  SCLogError(SC_ERR_PCRE_COMPILE, "Compile of \"%s\" failed at offset "
45  "%" PRId32 ": %s", PARSE_REGEX, eo, eb);
46  exit(EXIT_FAILURE);
47  }
48  parse_regex_study = pcre_study(parse_regex, 0, &eb);
49  if (eb != NULL) {
50  SCLogError(SC_ERR_PCRE_STUDY, "pcre study failed: %s", eb);
51  exit(EXIT_FAILURE);
52  }
53 }
54 
55 void ParseSizeDeinit(void)
56 {
57 
58  if (parse_regex != NULL)
59  pcre_free(parse_regex);
60  if (parse_regex_study != NULL)
61  pcre_free_study(parse_regex_study);
62 }
63 
64 /* size string parsing API */
65 
66 static int ParseSizeString(const char *size, double *res)
67 {
68 #define MAX_SUBSTRINGS 30
69  int pcre_exec_ret;
70  int r;
71  int ov[MAX_SUBSTRINGS];
72  int retval = 0;
73  char str[128];
74  char str2[128];
75 
76  *res = 0;
77 
78  if (size == NULL) {
79  SCLogError(SC_ERR_INVALID_ARGUMENTS,"invalid size argument - NULL. Valid size "
80  "argument should be in the format - \n"
81  "xxx <- indicates it is just bytes\n"
82  "xxxkb or xxxKb or xxxKB or xxxkB <- indicates kilobytes\n"
83  "xxxmb or xxxMb or xxxMB or xxxmB <- indicates megabytes\n"
84  "xxxgb or xxxGb or xxxGB or xxxgB <- indicates gigabytes.\n"
85  );
86  retval = -2;
87  goto end;
88  }
89 
90  pcre_exec_ret = pcre_exec(parse_regex, parse_regex_study, size, strlen(size), 0, 0,
91  ov, MAX_SUBSTRINGS);
92  if (!(pcre_exec_ret == 2 || pcre_exec_ret == 3)) {
93  SCLogError(SC_ERR_PCRE_MATCH, "invalid size argument - %s. Valid size "
94  "argument should be in the format - \n"
95  "xxx <- indicates it is just bytes\n"
96  "xxxkb or xxxKb or xxxKB or xxxkB <- indicates kilobytes\n"
97  "xxxmb or xxxMb or xxxMB or xxxmB <- indicates megabytes\n"
98  "xxxgb or xxxGb or xxxGB or xxxgB <- indicates gigabytes.\n",
99  size);
100  retval = -2;
101  goto end;
102  }
103 
104  r = pcre_copy_substring((char *)size, ov, MAX_SUBSTRINGS, 1,
105  str, sizeof(str));
106  if (r < 0) {
107  SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre_copy_substring failed");
108  retval = -2;
109  goto end;
110  }
111 
112  char *endptr, *str_ptr = str;
113  errno = 0;
114  *res = strtod(str_ptr, &endptr);
115  if (errno == ERANGE) {
116  SCLogError(SC_ERR_NUMERIC_VALUE_ERANGE, "Numeric value out of range");
117  retval = -1;
118  goto end;
119  } else if (endptr == str_ptr) {
120  SCLogError(SC_ERR_INVALID_NUMERIC_VALUE, "Invalid numeric value");
121  retval = -1;
122  goto end;
123  }
124 
125  if (pcre_exec_ret == 3) {
126  r = pcre_copy_substring((char *)size, ov, MAX_SUBSTRINGS, 2,
127  str2, sizeof(str2));
128  if (r < 0) {
129  SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre_copy_substring failed");
130  retval = -2;
131  goto end;
132  }
133 
134  if (strcasecmp(str2, "kb") == 0) {
135  *res *= 1024;
136  } else if (strcasecmp(str2, "mb") == 0) {
137  *res *= 1024 * 1024;
138  } else if (strcasecmp(str2, "gb") == 0) {
139  *res *= 1024 * 1024 * 1024;
140  } else {
141  /* Bad unit. */
142  retval = -1;
143  goto end;
144  }
145  }
146 
147  retval = 0;
148 end:
149  return retval;
150 }
151 
152 int ParseSizeStringU8(const char *size, uint8_t *res)
153 {
154  double temp_res = 0;
155 
156  *res = 0;
157  int r = ParseSizeString(size, &temp_res);
158  if (r < 0)
159  return r;
160 
161  if (temp_res > UINT8_MAX)
162  return -1;
163 
164  *res = temp_res;
165 
166  return 0;
167 }
168 
169 int ParseSizeStringU16(const char *size, uint16_t *res)
170 {
171  double temp_res = 0;
172 
173  *res = 0;
174  int r = ParseSizeString(size, &temp_res);
175  if (r < 0)
176  return r;
177 
178  if (temp_res > UINT16_MAX)
179  return -1;
180 
181  *res = temp_res;
182 
183  return 0;
184 }
185 
186 int ParseSizeStringU32(const char *size, uint32_t *res)
187 {
188  double temp_res = 0;
189 
190  *res = 0;
191  int r = ParseSizeString(size, &temp_res);
192  if (r < 0)
193  return r;
194 
195  if (temp_res > UINT32_MAX)
196  return -1;
197 
198  *res = temp_res;
199 
200  return 0;
201 }
202 
203 int ParseSizeStringU64(const char *size, uint64_t *res)
204 {
205  double temp_res = 0;
206 
207  *res = 0;
208  int r = ParseSizeString(size, &temp_res);
209  if (r < 0)
210  return r;
211 
212  if (temp_res > UINT64_MAX)
213  return -1;
214 
215  *res = temp_res;
216 
217  return 0;
218 }
219 
220 /*********************************Unittests********************************/
221 
222 #ifdef UNITTESTS
223 
224 static int UtilMiscParseSizeStringTest01(void)
225 {
226  const char *str;
227  double result;
228 
229  /* no space */
230 
231  str = "10";
232  result = 0;
233  if (ParseSizeString(str, &result) > 0) {
234  goto error;
235  }
236  if (result != 10) {
237  goto error;
238  }
239 
240  str = "10kb";
241  result = 0;
242  if (ParseSizeString(str, &result) > 0) {
243  goto error;
244  }
245  if (result != 10 * 1024) {
246  goto error;
247  }
248 
249  str = "10Kb";
250  result = 0;
251  if (ParseSizeString(str, &result) > 0) {
252  goto error;
253  }
254  if (result != 10 * 1024) {
255  goto error;
256  }
257 
258  str = "10KB";
259  result = 0;
260  if (ParseSizeString(str, &result) > 0) {
261  goto error;
262  }
263  if (result != 10 * 1024) {
264  goto error;
265  }
266 
267  str = "10mb";
268  result = 0;
269  if (ParseSizeString(str, &result) > 0) {
270  goto error;
271  }
272  if (result != 10 * 1024 * 1024) {
273  goto error;
274  }
275 
276  str = "10gb";
277  result = 0;
278  if (ParseSizeString(str, &result) > 0) {
279  goto error;
280  }
281  if (result != 10737418240UL) {
282  goto error;
283  }
284 
285 
286  /* space start */
287 
288  str = " 10";
289  result = 0;
290  if (ParseSizeString(str, &result) > 0) {
291  goto error;
292  }
293  if (result != 10) {
294  goto error;
295  }
296 
297  str = " 10kb";
298  result = 0;
299  if (ParseSizeString(str, &result) > 0) {
300  goto error;
301  }
302  if (result != 10 * 1024) {
303  goto error;
304  }
305 
306  str = " 10Kb";
307  result = 0;
308  if (ParseSizeString(str, &result) > 0) {
309  goto error;
310  }
311  if (result != 10 * 1024) {
312  goto error;
313  }
314 
315  str = " 10KB";
316  result = 0;
317  if (ParseSizeString(str, &result) > 0) {
318  goto error;
319  }
320  if (result != 10 * 1024) {
321  goto error;
322  }
323 
324  str = " 10mb";
325  result = 0;
326  if (ParseSizeString(str, &result) > 0) {
327  goto error;
328  }
329  if (result != 10 * 1024 * 1024) {
330  goto error;
331  }
332 
333  str = " 10gb";
334  result = 0;
335  if (ParseSizeString(str, &result) > 0) {
336  goto error;
337  }
338  if (result != 10737418240) {
339  goto error;
340  }
341 
342  /* space end */
343 
344  str = "10 ";
345  result = 0;
346  if (ParseSizeString(str, &result) > 0) {
347  goto error;
348  }
349  if (result != 10) {
350  goto error;
351  }
352 
353  str = "10kb ";
354  result = 0;
355  if (ParseSizeString(str, &result) > 0) {
356  goto error;
357  }
358  if (result != 10 * 1024) {
359  goto error;
360  }
361 
362  str = "10Kb ";
363  result = 0;
364  if (ParseSizeString(str, &result) > 0) {
365  goto error;
366  }
367  if (result != 10 * 1024) {
368  goto error;
369  }
370 
371  str = "10KB ";
372  result = 0;
373  if (ParseSizeString(str, &result) > 0) {
374  goto error;
375  }
376  if (result != 10 * 1024) {
377  goto error;
378  }
379 
380  str = "10mb ";
381  result = 0;
382  if (ParseSizeString(str, &result) > 0) {
383  goto error;
384  }
385  if (result != 10 * 1024 * 1024) {
386  goto error;
387  }
388 
389  str = "10gb ";
390  result = 0;
391  if (ParseSizeString(str, &result) > 0) {
392  goto error;
393  }
394  if (result != 10737418240) {
395  goto error;
396  }
397 
398  /* space start - space end */
399 
400  str = " 10 ";
401  result = 0;
402  if (ParseSizeString(str, &result) > 0) {
403  goto error;
404  }
405  if (result != 10) {
406  goto error;
407  }
408 
409  str = " 10kb ";
410  result = 0;
411  if (ParseSizeString(str, &result) > 0) {
412  goto error;
413  }
414  if (result != 10 * 1024) {
415  goto error;
416  }
417 
418  str = " 10Kb ";
419  result = 0;
420  if (ParseSizeString(str, &result) > 0) {
421  goto error;
422  }
423  if (result != 10 * 1024) {
424  goto error;
425  }
426 
427  str = " 10KB ";
428  result = 0;
429  if (ParseSizeString(str, &result) > 0) {
430  goto error;
431  }
432  if (result != 10 * 1024) {
433  goto error;
434  }
435 
436  str = " 10mb ";
437  result = 0;
438  if (ParseSizeString(str, &result) > 0) {
439  goto error;
440  }
441  if (result != 10 * 1024 * 1024) {
442  goto error;
443  }
444 
445  str = " 10gb ";
446  result = 0;
447  if (ParseSizeString(str, &result) > 0) {
448  goto error;
449  }
450  if (result != 10737418240) {
451  goto error;
452  }
453 
454 
455  /* space between number and scale */
456 
457  /* no space */
458 
459  str = "10";
460  result = 0;
461  if (ParseSizeString(str, &result) > 0) {
462  goto error;
463  }
464  if (result != 10) {
465  goto error;
466  }
467 
468  str = "10 kb";
469  result = 0;
470  if (ParseSizeString(str, &result) > 0) {
471  goto error;
472  }
473  if (result != 10 * 1024) {
474  goto error;
475  }
476 
477  str = "10 Kb";
478  result = 0;
479  if (ParseSizeString(str, &result) > 0) {
480  goto error;
481  }
482  if (result != 10 * 1024) {
483  goto error;
484  }
485 
486  str = "10 KB";
487  result = 0;
488  if (ParseSizeString(str, &result) > 0) {
489  goto error;
490  }
491  if (result != 10 * 1024) {
492  goto error;
493  }
494 
495  str = "10 mb";
496  result = 0;
497  if (ParseSizeString(str, &result) > 0) {
498  goto error;
499  }
500  if (result != 10 * 1024 * 1024) {
501  goto error;
502  }
503 
504  str = "10 gb";
505  result = 0;
506  if (ParseSizeString(str, &result) > 0) {
507  goto error;
508  }
509  if (result != 10737418240) {
510  goto error;
511  }
512 
513 
514  /* space start */
515 
516  str = " 10";
517  result = 0;
518  if (ParseSizeString(str, &result) > 0) {
519  goto error;
520  }
521  if (result != 10) {
522  goto error;
523  }
524 
525  str = " 10 kb";
526  result = 0;
527  if (ParseSizeString(str, &result) > 0) {
528  goto error;
529  }
530  if (result != 10 * 1024) {
531  goto error;
532  }
533 
534  str = " 10 Kb";
535  result = 0;
536  if (ParseSizeString(str, &result) > 0) {
537  goto error;
538  }
539  if (result != 10 * 1024) {
540  goto error;
541  }
542 
543  str = " 10 KB";
544  result = 0;
545  if (ParseSizeString(str, &result) > 0) {
546  goto error;
547  }
548  if (result != 10 * 1024) {
549  goto error;
550  }
551 
552  str = " 10 mb";
553  result = 0;
554  if (ParseSizeString(str, &result) > 0) {
555  goto error;
556  }
557  if (result != 10 * 1024 * 1024) {
558  goto error;
559  }
560 
561  str = " 10 gb";
562  result = 0;
563  if (ParseSizeString(str, &result) > 0) {
564  goto error;
565  }
566  if (result != 10737418240) {
567  goto error;
568  }
569 
570  /* space end */
571 
572  str = "10 ";
573  result = 0;
574  if (ParseSizeString(str, &result) > 0) {
575  goto error;
576  }
577  if (result != 10) {
578  goto error;
579  }
580 
581  str = "10 kb ";
582  result = 0;
583  if (ParseSizeString(str, &result) > 0) {
584  goto error;
585  }
586  if (result != 10 * 1024) {
587  goto error;
588  }
589 
590  str = "10 Kb ";
591  result = 0;
592  if (ParseSizeString(str, &result) > 0) {
593  goto error;
594  }
595  if (result != 10 * 1024) {
596  goto error;
597  }
598 
599  str = "10 KB ";
600  result = 0;
601  if (ParseSizeString(str, &result) > 0) {
602  goto error;
603  }
604  if (result != 10 * 1024) {
605  goto error;
606  }
607 
608  str = "10 mb ";
609  result = 0;
610  if (ParseSizeString(str, &result) > 0) {
611  goto error;
612  }
613  if (result != 10 * 1024 * 1024) {
614  goto error;
615  }
616 
617  str = "10 gb ";
618  result = 0;
619  if (ParseSizeString(str, &result) > 0) {
620  goto error;
621  }
622  if (result != 10737418240) {
623  goto error;
624  }
625 
626  /* space start - space end */
627 
628  str = " 10 ";
629  result = 0;
630  if (ParseSizeString(str, &result) > 0) {
631  goto error;
632  }
633  if (result != 10) {
634  goto error;
635  }
636 
637  str = " 10 kb ";
638  result = 0;
639  if (ParseSizeString(str, &result) > 0) {
640  goto error;
641  }
642  if (result != 10 * 1024) {
643  goto error;
644  }
645 
646  str = " 10 Kb ";
647  result = 0;
648  if (ParseSizeString(str, &result) > 0) {
649  goto error;
650  }
651  if (result != 10 * 1024) {
652  goto error;
653  }
654 
655  str = " 10 KB ";
656  result = 0;
657  if (ParseSizeString(str, &result) > 0) {
658  goto error;
659  }
660  if (result != 10 * 1024) {
661  goto error;
662  }
663 
664  str = " 10 mb ";
665  result = 0;
666  if (ParseSizeString(str, &result) > 0) {
667  goto error;
668  }
669  if (result != 10 * 1024 * 1024) {
670  goto error;
671  }
672 
673  str = " 10 gb ";
674  result = 0;
675  if (ParseSizeString(str, &result) > 0) {
676  goto error;
677  }
678  if (result != 10737418240) {
679  goto error;
680  }
681 
682  /* no space */
683 
684  str = "10.5";
685  result = 0;
686  if (ParseSizeString(str, &result) > 0) {
687  goto error;
688  }
689  if (result != 10.5) {
690  goto error;
691  }
692 
693  str = "10.5kb";
694  result = 0;
695  if (ParseSizeString(str, &result) > 0) {
696  goto error;
697  }
698  if (result != 10.5 * 1024) {
699  goto error;
700  }
701 
702  str = "10.5Kb";
703  result = 0;
704  if (ParseSizeString(str, &result) > 0) {
705  goto error;
706  }
707  if (result != 10.5 * 1024) {
708  goto error;
709  }
710 
711  str = "10.5KB";
712  result = 0;
713  if (ParseSizeString(str, &result) > 0) {
714  goto error;
715  }
716  if (result != 10.5 * 1024) {
717  goto error;
718  }
719 
720  str = "10.5mb";
721  result = 0;
722  if (ParseSizeString(str, &result) > 0) {
723  goto error;
724  }
725  if (result != 10.5 * 1024 * 1024) {
726  goto error;
727  }
728 
729  str = "10.5gb";
730  result = 0;
731  if (ParseSizeString(str, &result) > 0) {
732  goto error;
733  }
734  if (result != 10.5 * 1024 * 1024 * 1024) {
735  goto error;
736  }
737 
738 
739  /* space start */
740 
741  str = " 10.5";
742  result = 0;
743  if (ParseSizeString(str, &result) > 0) {
744  goto error;
745  }
746  if (result != 10.5) {
747  goto error;
748  }
749 
750  str = " 10.5kb";
751  result = 0;
752  if (ParseSizeString(str, &result) > 0) {
753  goto error;
754  }
755  if (result != 10.5 * 1024) {
756  goto error;
757  }
758 
759  str = " 10.5Kb";
760  result = 0;
761  if (ParseSizeString(str, &result) > 0) {
762  goto error;
763  }
764  if (result != 10.5 * 1024) {
765  goto error;
766  }
767 
768  str = " 10.5KB";
769  result = 0;
770  if (ParseSizeString(str, &result) > 0) {
771  goto error;
772  }
773  if (result != 10.5 * 1024) {
774  goto error;
775  }
776 
777  str = " 10.5mb";
778  result = 0;
779  if (ParseSizeString(str, &result) > 0) {
780  goto error;
781  }
782  if (result != 10.5 * 1024 * 1024) {
783  goto error;
784  }
785 
786  str = " 10.5gb";
787  result = 0;
788  if (ParseSizeString(str, &result) > 0) {
789  goto error;
790  }
791  if (result != 10.5 * 1024 * 1024 * 1024) {
792  goto error;
793  }
794 
795  /* space end */
796 
797  str = "10.5 ";
798  result = 0;
799  if (ParseSizeString(str, &result) > 0) {
800  goto error;
801  }
802  if (result != 10.5) {
803  goto error;
804  }
805 
806  str = "10.5kb ";
807  result = 0;
808  if (ParseSizeString(str, &result) > 0) {
809  goto error;
810  }
811  if (result != 10.5 * 1024) {
812  goto error;
813  }
814 
815  str = "10.5Kb ";
816  result = 0;
817  if (ParseSizeString(str, &result) > 0) {
818  goto error;
819  }
820  if (result != 10.5 * 1024) {
821  goto error;
822  }
823 
824  str = "10.5KB ";
825  result = 0;
826  if (ParseSizeString(str, &result) > 0) {
827  goto error;
828  }
829  if (result != 10.5 * 1024) {
830  goto error;
831  }
832 
833  str = "10.5mb ";
834  result = 0;
835  if (ParseSizeString(str, &result) > 0) {
836  goto error;
837  }
838  if (result != 10.5 * 1024 * 1024) {
839  goto error;
840  }
841 
842  str = "10.5gb ";
843  result = 0;
844  if (ParseSizeString(str, &result) > 0) {
845  goto error;
846  }
847  if (result != 10.5 * 1024 * 1024 * 1024) {
848  goto error;
849  }
850 
851  /* space start - space end */
852 
853  str = " 10.5 ";
854  result = 0;
855  if (ParseSizeString(str, &result) > 0) {
856  goto error;
857  }
858  if (result != 10.5) {
859  goto error;
860  }
861 
862  str = " 10.5kb ";
863  result = 0;
864  if (ParseSizeString(str, &result) > 0) {
865  goto error;
866  }
867  if (result != 10.5 * 1024) {
868  goto error;
869  }
870 
871  str = " 10.5Kb ";
872  result = 0;
873  if (ParseSizeString(str, &result) > 0) {
874  goto error;
875  }
876  if (result != 10.5 * 1024) {
877  goto error;
878  }
879 
880  str = " 10.5KB ";
881  result = 0;
882  if (ParseSizeString(str, &result) > 0) {
883  goto error;
884  }
885  if (result != 10.5 * 1024) {
886  goto error;
887  }
888 
889  str = " 10.5mb ";
890  result = 0;
891  if (ParseSizeString(str, &result) > 0) {
892  goto error;
893  }
894  if (result != 10.5 * 1024 * 1024) {
895  goto error;
896  }
897 
898  str = " 10.5gb ";
899  result = 0;
900  if (ParseSizeString(str, &result) > 0) {
901  goto error;
902  }
903  if (result != 10.5 * 1024 * 1024 * 1024) {
904  goto error;
905  }
906 
907 
908  /* space between number and scale */
909 
910  /* no space */
911 
912  str = "10.5";
913  result = 0;
914  if (ParseSizeString(str, &result) > 0) {
915  goto error;
916  }
917  if (result != 10.5) {
918  goto error;
919  }
920 
921  str = "10.5 kb";
922  result = 0;
923  if (ParseSizeString(str, &result) > 0) {
924  goto error;
925  }
926  if (result != 10.5 * 1024) {
927  goto error;
928  }
929 
930  str = "10.5 Kb";
931  result = 0;
932  if (ParseSizeString(str, &result) > 0) {
933  goto error;
934  }
935  if (result != 10.5 * 1024) {
936  goto error;
937  }
938 
939  str = "10.5 KB";
940  result = 0;
941  if (ParseSizeString(str, &result) > 0) {
942  goto error;
943  }
944  if (result != 10.5 * 1024) {
945  goto error;
946  }
947 
948  str = "10.5 mb";
949  result = 0;
950  if (ParseSizeString(str, &result) > 0) {
951  goto error;
952  }
953  if (result != 10.5 * 1024 * 1024) {
954  goto error;
955  }
956 
957  str = "10.5 gb";
958  result = 0;
959  if (ParseSizeString(str, &result) > 0) {
960  goto error;
961  }
962  if (result != 10.5 * 1024 * 1024 * 1024) {
963  goto error;
964  }
965 
966 
967  /* space start */
968 
969  str = " 10.5";
970  result = 0;
971  if (ParseSizeString(str, &result) > 0) {
972  goto error;
973  }
974  if (result != 10.5) {
975  goto error;
976  }
977 
978  str = " 10.5 kb";
979  result = 0;
980  if (ParseSizeString(str, &result) > 0) {
981  goto error;
982  }
983  if (result != 10.5 * 1024) {
984  goto error;
985  }
986 
987  str = " 10.5 Kb";
988  result = 0;
989  if (ParseSizeString(str, &result) > 0) {
990  goto error;
991  }
992  if (result != 10.5 * 1024) {
993  goto error;
994  }
995 
996  str = " 10.5 KB";
997  result = 0;
998  if (ParseSizeString(str, &result) > 0) {
999  goto error;
1000  }
1001  if (result != 10.5 * 1024) {
1002  goto error;
1003  }
1004 
1005  str = " 10.5 mb";
1006  result = 0;
1007  if (ParseSizeString(str, &result) > 0) {
1008  goto error;
1009  }
1010  if (result != 10.5 * 1024 * 1024) {
1011  goto error;
1012  }
1013 
1014  str = " 10.5 gb";
1015  result = 0;
1016  if (ParseSizeString(str, &result) > 0) {
1017  goto error;
1018  }
1019  if (result != 10.5 * 1024 * 1024 * 1024) {
1020  goto error;
1021  }
1022 
1023  /* space end */
1024 
1025  str = "10.5 ";
1026  result = 0;
1027  if (ParseSizeString(str, &result) > 0) {
1028  goto error;
1029  }
1030  if (result != 10.5) {
1031  goto error;
1032  }
1033 
1034  str = "10.5 kb ";
1035  result = 0;
1036  if (ParseSizeString(str, &result) > 0) {
1037  goto error;
1038  }
1039  if (result != 10.5 * 1024) {
1040  goto error;
1041  }
1042 
1043  str = "10.5 Kb ";
1044  result = 0;
1045  if (ParseSizeString(str, &result) > 0) {
1046  goto error;
1047  }
1048  if (result != 10.5 * 1024) {
1049  goto error;
1050  }
1051 
1052  str = "10.5 KB ";
1053  result = 0;
1054  if (ParseSizeString(str, &result) > 0) {
1055  goto error;
1056  }
1057  if (result != 10.5 * 1024) {
1058  goto error;
1059  }
1060 
1061  str = "10.5 mb ";
1062  result = 0;
1063  if (ParseSizeString(str, &result) > 0) {
1064  goto error;
1065  }
1066  if (result != 10.5 * 1024 * 1024) {
1067  goto error;
1068  }
1069 
1070  str = "10.5 gb ";
1071  result = 0;
1072  if (ParseSizeString(str, &result) > 0) {
1073  goto error;
1074  }
1075  if (result != 10.5 * 1024 * 1024 * 1024) {
1076  goto error;
1077  }
1078 
1079  /* space start - space end */
1080 
1081  str = " 10.5 ";
1082  result = 0;
1083  if (ParseSizeString(str, &result) > 0) {
1084  goto error;
1085  }
1086  if (result != 10.5) {
1087  goto error;
1088  }
1089 
1090  str = " 10.5 kb ";
1091  result = 0;
1092  if (ParseSizeString(str, &result) > 0) {
1093  goto error;
1094  }
1095  if (result != 10.5 * 1024) {
1096  goto error;
1097  }
1098 
1099  str = " 10.5 Kb ";
1100  result = 0;
1101  if (ParseSizeString(str, &result) > 0) {
1102  goto error;
1103  }
1104  if (result != 10.5 * 1024) {
1105  goto error;
1106  }
1107 
1108  str = " 10.5 KB ";
1109  result = 0;
1110  if (ParseSizeString(str, &result) > 0) {
1111  goto error;
1112  }
1113  if (result != 10.5 * 1024) {
1114  goto error;
1115  }
1116 
1117  str = " 10.5 mb ";
1118  result = 0;
1119  if (ParseSizeString(str, &result) > 0) {
1120  goto error;
1121  }
1122  if (result != 10.5 * 1024 * 1024) {
1123  goto error;
1124  }
1125 
1126  str = " 10.5 gb ";
1127  result = 0;
1128  if (ParseSizeString(str, &result) > 0) {
1129  goto error;
1130  }
1131  if (result != 10.5 * 1024 * 1024 * 1024) {
1132  goto error;
1133  }
1134 
1135  /* Should fail on unknown units. */
1136  if (ParseSizeString("32eb", &result) > 0) {
1137  goto error;
1138  }
1139 
1140  return 1;
1141  error:
1142  return 0;
1143 }
1144 
1145 #endif /* UNITTESTS */
1146 
1148 {
1149 #ifdef UNITTESTS
1150  UtRegisterTest("UtilMiscParseSizeStringTest01",
1151  UtilMiscParseSizeStringTest01);
1152 #endif /* UNITTESTS */
1153 
1154  return;
1155 }
int ParseSizeStringU64(const char *size, uint64_t *res)
Definition: util-misc.c:203
int ParseSizeStringU16(const char *size, uint16_t *res)
Definition: util-misc.c:169
#define PARSE_REGEX
Definition: util-misc.c:32
#define str(s)
void UtilMiscRegisterTests(void)
Definition: util-misc.c:1147
#define SCLogError(err_code,...)
Macro used to log ERROR messages.
Definition: util-debug.h:294
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
void ParseSizeDeinit(void)
Definition: util-misc.c:55
int ParseSizeStringU8(const char *size, uint8_t *res)
Definition: util-misc.c:152
PoolThreadReserved res
void ParseSizeInit(void)
Definition: util-misc.c:36
#define MAX_SUBSTRINGS
#define pcre_free_study
int ParseSizeStringU32(const char *size, uint32_t *res)
Definition: util-misc.c:186