File: rt_139622_memory-leak.patch

package info (click to toggle)
libencode-perl 3.08-1%2Bdeb11u2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 11,208 kB
  • sloc: perl: 4,395; ansic: 1,077; makefile: 8
file content (82 lines) | stat: -rw-r--r-- 2,319 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Description: Fix memory leak
Origin: upstream releases 3.13, 3.14, 3.15
Bug-Debian: https://bugs.debian.org/995804
Bug: https://rt.cpan.org/Ticket/Display.html?id=139622
Reviewed-by: gregor herrmann <gregoa@debian.org>
Last-Update: 2021-11-01

--- a/Encode.xs
+++ b/Encode.xs
@@ -154,7 +154,7 @@ encode_method(pTHX_ const encode_t * enc
     STRLEN sdone = 0;
     /* We allocate slen+1.
        PerlIO dumps core if this value is smaller than this. */
-    SV *dst = newSV(slen+1);
+    SV *dst = sv_2mortal(newSV(slen+1));
     U8 *d = (U8 *)SvPVX(dst);
     STRLEN dlen = SvLEN(dst)-1;
     int code = 0;
@@ -810,13 +810,12 @@ CODE:
     tmp = encode_method(aTHX_ enc, enc->t_utf8, src, s, slen, check,
                 &offset, term, &code, fallback_cb);
     sv_catsv(dst, tmp);
-    SvREFCNT_dec(tmp);
     SvIV_set(off, (IV)offset);
     RETVAL = (code == ENCODE_FOUND_TERM);
 OUTPUT:
     RETVAL
 
-SV *
+void
 Method_decode(obj,src,check_sv = &PL_sv_no)
 SV *	obj
 SV *	src
@@ -828,6 +827,7 @@ PREINIT:
     encode_t *enc;
     U8 *s;
     STRLEN slen;
+    SV *ret;
 INIT:
     SvGETMAGIC(src);
     SvGETMAGIC(check_sv);
@@ -841,13 +841,13 @@ CODE:
     s = modify ? (U8 *)SvPV_force_nomg(src, slen) : (U8 *)SvPV_nomg(src, slen);
     if (SvUTF8(src))
         utf8_safe_downgrade(aTHX_ &src, &s, &slen, modify);
-    RETVAL = encode_method(aTHX_ enc, enc->t_utf8, src, s, slen, check,
+    ret = encode_method(aTHX_ enc, enc->t_utf8, src, s, slen, check,
               NULL, Nullsv, NULL, fallback_cb);
-    SvUTF8_on(RETVAL);
-OUTPUT:
-    RETVAL
+    SvUTF8_on(ret);
+    ST(0) = ret;
+    XSRETURN(1);
 
-SV *
+void
 Method_encode(obj,src,check_sv = &PL_sv_no)
 SV *	obj
 SV *	src
@@ -859,6 +859,7 @@ PREINIT:
     encode_t *enc;
     U8 *s;
     STRLEN slen;
+    SV *ret;
 INIT:
     SvGETMAGIC(src);
     SvGETMAGIC(check_sv);
@@ -872,10 +873,10 @@ CODE:
     s = modify ? (U8 *)SvPV_force_nomg(src, slen) : (U8 *)SvPV_nomg(src, slen);
     if (!SvUTF8(src))
         utf8_safe_upgrade(aTHX_ &src, &s, &slen, modify);
-    RETVAL = encode_method(aTHX_ enc, enc->f_utf8, src, s, slen, check,
+    ret = encode_method(aTHX_ enc, enc->f_utf8, src, s, slen, check,
               NULL, Nullsv, NULL, fallback_cb);
-OUTPUT:
-    RETVAL
+    ST(0) = ret;
+    XSRETURN(1);
 
 bool
 Method_needs_lines(obj)