escape more in fmt_ldapescape
This commit is contained in:
parent
b03a0e8a66
commit
1b17f47def
1
CHANGES
1
CHANGES
@ -6,6 +6,7 @@
|
|||||||
add some int overflow check macros to rangecheck.h
|
add some int overflow check macros to rangecheck.h
|
||||||
fmt_ip6 compresses at best spot, not at first spot (Nikola Vladov)
|
fmt_ip6 compresses at best spot, not at first spot (Nikola Vladov)
|
||||||
use inttypes.h to declare ints in uint*.h
|
use inttypes.h to declare ints in uint*.h
|
||||||
|
escape more in fmt_ldapescape
|
||||||
|
|
||||||
0.25:
|
0.25:
|
||||||
array_allocate no longer truncates the array
|
array_allocate no longer truncates the array
|
||||||
|
19
rangecheck.h
19
rangecheck.h
@ -25,6 +25,13 @@ __static inline int range_ptrinbuf(const void* buf,size_t len,const void* ptr) {
|
|||||||
a very large number. */
|
a very large number. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* same thing, but the buffer is specified by a pointer to the first
|
||||||
|
* byte (Min) and a pointer after the last byte (Max). */
|
||||||
|
__static inline int range_ptrinbuf2(const void* Min,const void* Max,const void* ptr) {
|
||||||
|
return (Min && ptr>=Min && ptr<Max);
|
||||||
|
/* Min <= Max is implicitly checked here */
|
||||||
|
}
|
||||||
|
|
||||||
/* Is this a plausible buffer?
|
/* Is this a plausible buffer?
|
||||||
* Check whether buf is NULL, and whether buf+len overflows.
|
* Check whether buf is NULL, and whether buf+len overflows.
|
||||||
* Does NOT check whether buf has a non-zero length! */
|
* Does NOT check whether buf has a non-zero length! */
|
||||||
@ -32,6 +39,12 @@ __static inline int range_validbuf(const void* buf,size_t len) {
|
|||||||
return (buf && (uintptr_t)buf+len>=(uintptr_t)buf);
|
return (buf && (uintptr_t)buf+len>=(uintptr_t)buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* same thing but buffer is given as pointer to first byte (Min) and
|
||||||
|
* pointer beyond last byte (Max). Again, an 0-size buffer is valid. */
|
||||||
|
__static inline int range_validbuf2(const void* Min,const void* Max) {
|
||||||
|
return (Min && Max>=Min);
|
||||||
|
}
|
||||||
|
|
||||||
/* is buf2[0..len2-1] inside buf1[0..len-1]? */
|
/* is buf2[0..len2-1] inside buf1[0..len-1]? */
|
||||||
__static inline int range_bufinbuf(const void* buf1,size_t len1,const void* buf2,size_t len2) {
|
__static inline int range_bufinbuf(const void* buf1,size_t len1,const void* buf2,size_t len2) {
|
||||||
return range_validbuf(buf1,len1) &&
|
return range_validbuf(buf1,len1) &&
|
||||||
@ -68,6 +81,12 @@ int range_str4inbuf(const void* buf,size_t len,const void* stringstart);
|
|||||||
* So I decided to add some integer overflow protection functionality
|
* So I decided to add some integer overflow protection functionality
|
||||||
* here for addition and subtraction, too. */
|
* here for addition and subtraction, too. */
|
||||||
|
|
||||||
|
/* usage:
|
||||||
|
* if (add_of(dest,a,b)) return EINVAL; // dest=a+b;
|
||||||
|
* if (sub_of(dest,a,b)) return EINVAL; // dest=a-b;
|
||||||
|
* if (assign(dest,some_int)) return EINVAL; // dest=some_int;
|
||||||
|
*/
|
||||||
|
|
||||||
/* two important assumptions:
|
/* two important assumptions:
|
||||||
* 1. the platform is using two's complement
|
* 1. the platform is using two's complement
|
||||||
* 2. there are 8 bits in a byte
|
* 2. there are 8 bits in a byte
|
||||||
|
20
test/range.c
20
test/range.c
@ -129,6 +129,18 @@ void check_rangeptrbuf() {
|
|||||||
assert(range_str4inbuf(y,sizeof(y),y+5)==1);
|
assert(range_str4inbuf(y,sizeof(y),y+5)==1);
|
||||||
assert(range_str4inbuf(y,sizeof(y),y+6)==0);
|
assert(range_str4inbuf(y,sizeof(y),y+6)==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(range_ptrinbuf2(buf,buf+sizeof(buf),buf));
|
||||||
|
assert(range_ptrinbuf2(buf+sizeof(buf),buf,buf)==0);
|
||||||
|
assert(range_ptrinbuf2(buf,buf+sizeof(buf),buf+sizeof(buf)-1));
|
||||||
|
assert(range_ptrinbuf2(buf,buf+sizeof(buf),buf+sizeof(buf))==0);
|
||||||
|
assert(range_ptrinbuf2(buf,buf,buf)==0);
|
||||||
|
assert(range_ptrinbuf2(0,buf+100,buf)==0);
|
||||||
|
|
||||||
|
assert(range_validbuf2(buf,buf+100));
|
||||||
|
assert(range_validbuf2(buf,buf-1)==0);
|
||||||
|
assert(range_validbuf2(buf,buf));
|
||||||
|
assert(range_validbuf2(NULL,buf+100)==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_intof() {
|
void check_intof() {
|
||||||
@ -190,6 +202,14 @@ void check_intof() {
|
|||||||
a=0; assert(sub_of(a,INT_MAX,10)==0 && a==INT_MAX-10);
|
a=0; assert(sub_of(a,INT_MAX,10)==0 && a==INT_MAX-10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
unsigned long long a;
|
||||||
|
/* caveat emptor: */
|
||||||
|
a=0; assert(add_of(a,0xfffffff0,0x10)==1);
|
||||||
|
/* this does NOT work and set a to 0x100000000, just like
|
||||||
|
* a=0xfffffff0+0x10 sets a to 0 in C! */
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
@ -7,7 +7,8 @@ size_t fmt_ldapescape(char* dest,const char* src,size_t len) {
|
|||||||
register const unsigned char* s=(const unsigned char*) src;
|
register const unsigned char* s=(const unsigned char*) src;
|
||||||
size_t written=0,i;
|
size_t written=0,i;
|
||||||
for (i=0; i<len; ++i) {
|
for (i=0; i<len; ++i) {
|
||||||
if (s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]==0 || s[i]=='\\') {
|
if (s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]==0 ||
|
||||||
|
s[i]=='\\' || s[i]<' ') {
|
||||||
if (dest) {
|
if (dest) {
|
||||||
dest[written]='\\';
|
dest[written]='\\';
|
||||||
dest[written+1]=fmt_tohex(s[i]>>4);
|
dest[written+1]=fmt_tohex(s[i]>>4);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user