semacode 0.7.2 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +16 -1
- data/README +6 -0
- data/Rakefile +1 -1
- data/ext/iec16022ecc200.c +34 -11
- data/ext/reedsol.h +2 -0
- data/ext/semacode.c +10 -3
- metadata +1 -1
data/CHANGELOG
CHANGED
@@ -22,4 +22,19 @@ CHANGELOG
|
|
22
22
|
|
23
23
|
* Fixes compiler errors with Fink not finding malloc.h
|
24
24
|
|
25
|
-
* Given up on making the gem do auto-require
|
25
|
+
* Given up on making the gem do auto-require
|
26
|
+
|
27
|
+
* Fixes a memory leak where the encoding list wasn't being freed.
|
28
|
+
|
29
|
+
|
30
|
+
2007-03-04 guido
|
31
|
+
|
32
|
+
* Free up internal memory allocated before we throw an exception
|
33
|
+
|
34
|
+
* Throw ArgError and RangeError exceptions rather than Runtime exceptions
|
35
|
+
|
36
|
+
* Don't return an inconsistent semacode when presented with overlong input
|
37
|
+
|
38
|
+
* Don't fail quietly either, throw an exception
|
39
|
+
|
40
|
+
* Very conservatively use a far smaller maximum value for input length than the header file suggests
|
data/README
CHANGED
@@ -141,3 +141,9 @@ The C code can throw runtime exceptions. Be sure to include
|
|
141
141
|
a catch block if you want to use this in production. Mostly
|
142
142
|
the exceptions are not recoverable, except for when the data
|
143
143
|
is too long, in which case you can shorten it and try again.
|
144
|
+
|
145
|
+
There are two type of exceptions that it will throw. The first
|
146
|
+
is a RangeError exception, which happens when the input is too
|
147
|
+
long or when it just can't find a fit for the data. The second
|
148
|
+
is a ArgumentError (ArgError?) exception that gets thrown when
|
149
|
+
the input contains data it cannot handle.
|
data/Rakefile
CHANGED
data/ext/iec16022ecc200.c
CHANGED
@@ -211,8 +211,7 @@ ecc200placement (int *array, int NR, int NC)
|
|
211
211
|
static void
|
212
212
|
ecc200 (unsigned char *binary, int bytes, int datablock, int rsblock)
|
213
213
|
{
|
214
|
-
int blocks = (bytes + 2) / datablock,
|
215
|
-
b;
|
214
|
+
int blocks = (bytes + 2) / datablock, b;
|
216
215
|
rs_init_gf (0x12d);
|
217
216
|
rs_init_code (rsblock, 1);
|
218
217
|
for (b = 0; b < blocks; b++)
|
@@ -240,7 +239,8 @@ ecc200encode (unsigned char *t, int tl, unsigned char *s, int sl, char *encoding
|
|
240
239
|
sp = 0;
|
241
240
|
if (strlen (encoding) < sl)
|
242
241
|
{
|
243
|
-
|
242
|
+
free(encoding);
|
243
|
+
rb_raise(rb_eArgError, "encoding string too short");
|
244
244
|
return 0;
|
245
245
|
}
|
246
246
|
// do the encoding
|
@@ -281,7 +281,8 @@ ecc200encode (unsigned char *t, int tl, unsigned char *s, int sl, char *encoding
|
|
281
281
|
{
|
282
282
|
if (newenc == 'x')
|
283
283
|
{
|
284
|
-
|
284
|
+
free(encoding);
|
285
|
+
rb_raise(rb_eArgError, "cannot encode character in X12", c);
|
285
286
|
return 0;
|
286
287
|
}
|
287
288
|
c &= 0x7f;
|
@@ -295,7 +296,8 @@ ecc200encode (unsigned char *t, int tl, unsigned char *s, int sl, char *encoding
|
|
295
296
|
{
|
296
297
|
if (newenc == 'x')
|
297
298
|
{
|
298
|
-
|
299
|
+
free(encoding);
|
300
|
+
rb_raise(rb_eArgError, "cannot encode character in X12", c);
|
299
301
|
return 0;
|
300
302
|
}
|
301
303
|
if (c < 32)
|
@@ -318,6 +320,7 @@ ecc200encode (unsigned char *t, int tl, unsigned char *s, int sl, char *encoding
|
|
318
320
|
out[p++] = (w - s3);
|
319
321
|
} else
|
320
322
|
{
|
323
|
+
free(encoding);
|
321
324
|
rb_raise(rb_eRuntimeError, "this should not be happening!", c);
|
322
325
|
return 0;
|
323
326
|
}
|
@@ -429,7 +432,8 @@ ecc200encode (unsigned char *t, int tl, unsigned char *s, int sl, char *encoding
|
|
429
432
|
}
|
430
433
|
break;
|
431
434
|
default:
|
432
|
-
|
435
|
+
free(encoding);
|
436
|
+
rb_raise(rb_eArgError, "unknown encoding attempted");
|
433
437
|
return 0; // failed
|
434
438
|
}
|
435
439
|
}
|
@@ -798,12 +802,28 @@ void iec16022init(int *Wptr, int *Hptr, const char *barcode)
|
|
798
802
|
unsigned char *
|
799
803
|
iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsigned char *barcode, int *lenp, int *maxp, int *eccp)
|
800
804
|
{
|
801
|
-
|
805
|
+
// GS
|
806
|
+
// max semacode size is 3116 (from iec16022ecc200.h)
|
807
|
+
// we over compensate and check that the input is within this length
|
808
|
+
// to avoid any buffer overflow conditions.
|
809
|
+
unsigned char binary[4096]; // encoded raw data and ecc to place in barcode
|
802
810
|
int W = 0,
|
803
811
|
H = 0;
|
804
812
|
char *encoding = 0;
|
805
813
|
unsigned char *grid = 0;
|
806
814
|
struct ecc200matrix_s *matrix;
|
815
|
+
|
816
|
+
// GS
|
817
|
+
// using the length from the 144x144 semacode in the matrix
|
818
|
+
// I don't trust the 3116 maximum length value ... and
|
819
|
+
// besides how many characters do you really need in a
|
820
|
+
// semacode?
|
821
|
+
|
822
|
+
if(barcodelen > 1556) {
|
823
|
+
rb_raise(rb_eRangeError, "barcode is too long (> 1556 chars)");
|
824
|
+
return NULL;
|
825
|
+
}
|
826
|
+
|
807
827
|
memset (binary, 0, sizeof (binary));
|
808
828
|
if (encodingptr)
|
809
829
|
encoding = *encodingptr;
|
@@ -818,7 +838,7 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
818
838
|
for (matrix = ecc200matrix; matrix->W && (matrix->W != W || matrix->H != H); matrix++);
|
819
839
|
if (!matrix->W)
|
820
840
|
{
|
821
|
-
rb_raise(
|
841
|
+
rb_raise(rb_eRangeError, "invalid size for barcode");
|
822
842
|
return 0;
|
823
843
|
}
|
824
844
|
if (!encoding)
|
@@ -831,7 +851,8 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
831
851
|
e = encmake (barcodelen, barcode, &len, 0);
|
832
852
|
if (len > matrix->bytes)
|
833
853
|
{
|
834
|
-
|
854
|
+
free(e);
|
855
|
+
rb_raise(rb_eRangeError, "cannot make barcode fit");
|
835
856
|
return 0;
|
836
857
|
}
|
837
858
|
}
|
@@ -860,7 +881,8 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
860
881
|
}
|
861
882
|
if (!matrix->W)
|
862
883
|
{
|
863
|
-
|
884
|
+
free(encoding);
|
885
|
+
rb_raise(rb_eRangeError, "overlong barcode");
|
864
886
|
return 0;
|
865
887
|
}
|
866
888
|
W = matrix->W;
|
@@ -868,7 +890,8 @@ iec16022ecc200 (int *Wptr, int *Hptr, char **encodingptr, int barcodelen, unsign
|
|
868
890
|
}
|
869
891
|
if (!ecc200encode (binary, matrix->bytes, barcode, barcodelen, encoding, lenp))
|
870
892
|
{
|
871
|
-
|
893
|
+
free(encoding);
|
894
|
+
rb_raise(rb_eRangeError, "barcode too long for expected encoding");
|
872
895
|
return 0;
|
873
896
|
}
|
874
897
|
// ecc code
|
data/ext/reedsol.h
CHANGED
data/ext/semacode.c
CHANGED
@@ -38,12 +38,17 @@ Due to a bug in the underlying encoder, we do two things
|
|
38
38
|
semacode_t*
|
39
39
|
encode_string(semacode_t *semacode, int message_length, char *message)
|
40
40
|
{
|
41
|
+
/* avoid obvious bad cases */
|
42
|
+
if(semacode == NULL || message == NULL || message_length < 1) {
|
43
|
+
return NULL;
|
44
|
+
}
|
45
|
+
|
41
46
|
/* deallocate if exists already */
|
42
|
-
if(semacode
|
47
|
+
if(semacode->data != NULL)
|
43
48
|
free(semacode->data);
|
44
49
|
|
45
50
|
/* deallocate if exists already */
|
46
|
-
if(semacode
|
51
|
+
if(semacode->encoding != NULL)
|
47
52
|
free(semacode->encoding);
|
48
53
|
|
49
54
|
bzero(semacode, sizeof(semacode_t));
|
@@ -87,6 +92,7 @@ semacode_free(semacode_t *semacode)
|
|
87
92
|
if(semacode->data != NULL)
|
88
93
|
free(semacode->encoding);
|
89
94
|
free(semacode->data);
|
95
|
+
/* zero before freeing */
|
90
96
|
bzero(semacode, sizeof(semacode));
|
91
97
|
free(semacode);
|
92
98
|
}
|
@@ -100,7 +106,7 @@ semacode_allocate(VALUE klass)
|
|
100
106
|
}
|
101
107
|
|
102
108
|
/*
|
103
|
-
Initialize the semacode. This function is called after a
|
109
|
+
Initialize the semacode. This function is called after a semacode is
|
104
110
|
created. Ruby objects are created using a new method, and then initialized
|
105
111
|
via the 'initialize' method once they have been allocated.
|
106
112
|
|
@@ -358,6 +364,7 @@ Init_semacode_native()
|
|
358
364
|
{
|
359
365
|
rb_mSemacode = rb_define_module ("DataMatrix");
|
360
366
|
rb_cEncoder = rb_define_class_under(rb_mSemacode, "Encoder", rb_cObject);
|
367
|
+
|
361
368
|
rb_define_alloc_func(rb_cEncoder, semacode_allocate);
|
362
369
|
|
363
370
|
rb_define_method(rb_cEncoder, "initialize", semacode_init, 1);
|