void-packages/srcpkgs/pilot-link/patches/refactor-iconv_const_char_ptr.patch
Đoàn Trần Công Danh 49cb564d14 srcpkgs/p*: convert patches to -Np1
* par is kept at -Np0

```sh
git grep -l '^patch_args=-Np0' "srcpkgs/$1*/template" |
while read template; do
	for p in ${template%/template}/patches/*; do
		sed -i '
			\,^[+-][+-][+-] /dev/null,b
			/^[*-]\+ [0-9]\+\(,[0-9]\+\)\? [*-]\+$/b
			s,^[*][*][*] ,&a/,
			/^--- /{
				s,\(^--- \)\(./\)*,\1a/,
				s,[.-][Oo][Rr][Ii][Gg]\([	/]\),\1,
				s/[.-][Oo][Rr][Ii][Gg]$//
				s/[.]patched[.]\([^.]\)/.\1/
				h
			}
			/^+++ -/{
				g
				s/^--- a/+++ b/
				b
			}
			s,\(^+++ \)\(./\)*,\1b/,
		' "$p"
	done
	sed -i '/^patch_args=/d' $template
done
```
2021-06-20 13:17:29 +07:00

106 lines
2 KiB
Diff

The iconv() functions to convert to and from Pilot charset pass
a const char* as the source text, but iconv() expects a char**.
Create a local copy of the const char* and use that.
Also add sanity checks to avoid dereferencing NULL pointers.
--- a/libpisync/util.c 2006-08-25 14:33:25.000000000 +0200
+++ b/libpisync/util.c 2016-12-20 14:55:18.996691848 +0100
@@ -104,24 +104,44 @@
int bytes, char **ptext, const char * pi_charset)
{
#ifdef HAVE_ICONV
+ char* ib;
char* ob;
iconv_t cd;
- size_t ibl, obl;
+ size_t tbl, ibl, obl;
+
+ if(NULL==text){
+ return -1;
+ }
+ tbl = strlen(text) + 1;
+ ib = calloc(tbl, sizeof(char));
+ if(NULL==ib){
+ return -1;
+ }
+ memcpy(ib, text, tbl);
if(NULL==pi_charset){
pi_charset = PILOT_CHARSET;
}
-
cd = iconv_open(pi_charset, charset);
- if (cd==(iconv_t)-1)
+ if (cd==(iconv_t)-1) {
+ free(ib);
return -1;
+ }
ibl = bytes;
obl = bytes * 4 + 1;
*ptext = ob = malloc(obl);
+ if(NULL==ob){
+ free(ib);
+ return -1;
+ }
- if (iconv(cd, &text, &ibl, &ob, &obl) == (size_t)-1)
+ if (iconv(cd, &ib, &ibl, &ob, &obl) == (size_t)-1) {
+ free(ib);
+ free(ob);
return -1;
+ }
+ free(ib);
*ob = '\0';
iconv_close(cd);
@@ -195,24 +215,44 @@
int bytes, char **text, const char * pi_charset)
{
#ifdef HAVE_ICONV
+ char* ib;
char* ob;
iconv_t cd;
- size_t ibl, obl;
+ size_t tbl, ibl, obl;
+
+ if(NULL==ptext){
+ return -1;
+ }
+ tbl = strlen(ptext) + 1;
+ ib = calloc(tbl, sizeof(char));
+ if(NULL==ib){
+ return -1;
+ }
+ memcpy(ib, ptext, tbl);
if(NULL==pi_charset){
pi_charset = PILOT_CHARSET;
}
-
cd = iconv_open(charset, pi_charset);
- if (cd==(iconv_t)-1)
+ if (cd==(iconv_t)-1) {
+ free(ib);
return -1;
+ }
ibl = bytes;
obl = bytes * 4 + 1;
*text = ob = malloc(obl);
+ if(NULL==ob){
+ free(ib);
+ return -1;
+ }
- if (iconv(cd, &ptext, &ibl, &ob, &obl) == (size_t)-1)
+ if (iconv(cd, &ib, &ibl, &ob, &obl) == (size_t)-1) {
+ free(ib);
+ free(ob);
return -1;
+ }
+ free(ib);
*ob = '\0';
iconv_close(cd);