aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2016-06-07 09:28:49 -0700
committerPaul Eggert2016-06-07 09:28:49 -0700
commit6e3adf8a4a796cea4328a528da48fc972b3feed6 (patch)
tree37c33253a4b92e9c0c6daa314a81740a855a2858 /src
parent973ce5a12352e1f88af335f8b57be2dcbe49c2b7 (diff)
downloademacs-6e3adf8a4a796cea4328a528da48fc972b3feed6.tar.gz
emacs-6e3adf8a4a796cea4328a528da48fc972b3feed6.zip
Fix crash in syntax.c after GC
Problem reported by Vincent Belaïche (Bug#23704). * src/syntax.c (skip_chars): Recompute pointers into the buffer after every call to update_syntax_table_forward, as it can GC.
Diffstat (limited to 'src')
-rw-r--r--src/syntax.c59
1 files changed, 24 insertions, 35 deletions
diff --git a/src/syntax.c b/src/syntax.c
index 16b7fabe938..6f536846466 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -2171,63 +2171,51 @@ skip_syntaxes (bool forwardp, Lisp_Object string, Lisp_Object lim)
2171 ptrdiff_t start_point = PT; 2171 ptrdiff_t start_point = PT;
2172 ptrdiff_t pos = PT; 2172 ptrdiff_t pos = PT;
2173 ptrdiff_t pos_byte = PT_BYTE; 2173 ptrdiff_t pos_byte = PT_BYTE;
2174 unsigned char *p = PT_ADDR, *endp, *stop; 2174 unsigned char *p, *endp, *stop;
2175
2176 if (forwardp)
2177 {
2178 endp = (XINT (lim) == GPT) ? GPT_ADDR : CHAR_POS_ADDR (XINT (lim));
2179 stop = (pos < GPT && GPT < XINT (lim)) ? GPT_ADDR : endp;
2180 }
2181 else
2182 {
2183 endp = CHAR_POS_ADDR (XINT (lim));
2184 stop = (pos >= GPT && GPT > XINT (lim)) ? GAP_END_ADDR : endp;
2185 }
2186 2175
2187 immediate_quit = 1; 2176 immediate_quit = 1;
2188 SETUP_SYNTAX_TABLE (pos, forwardp ? 1 : -1); 2177 SETUP_SYNTAX_TABLE (pos, forwardp ? 1 : -1);
2178
2189 if (forwardp) 2179 if (forwardp)
2190 { 2180 {
2191 if (multibyte) 2181 while (true)
2192 { 2182 {
2193 while (1) 2183 p = BYTE_POS_ADDR (pos_byte);
2184 endp = XINT (lim) == GPT ? GPT_ADDR : CHAR_POS_ADDR (XINT (lim));
2185 stop = pos < GPT && GPT < XINT (lim) ? GPT_ADDR : endp;
2186
2187 do
2194 { 2188 {
2195 int nbytes; 2189 int nbytes;
2196 2190
2197 if (p >= stop) 2191 if (p >= stop)
2198 { 2192 {
2199 if (p >= endp) 2193 if (p >= endp)
2200 break; 2194 goto done;
2201 p = GAP_END_ADDR; 2195 p = GAP_END_ADDR;
2202 stop = endp; 2196 stop = endp;
2203 } 2197 }
2204 c = STRING_CHAR_AND_LENGTH (p, nbytes); 2198 if (multibyte)
2199 c = STRING_CHAR_AND_LENGTH (p, nbytes);
2200 else
2201 c = *p, nbytes = 1;
2205 if (! fastmap[SYNTAX (c)]) 2202 if (! fastmap[SYNTAX (c)])
2206 break; 2203 goto done;
2207 p += nbytes, pos++, pos_byte += nbytes; 2204 p += nbytes, pos++, pos_byte += nbytes;
2208 UPDATE_SYNTAX_TABLE_FORWARD (pos);
2209 }
2210 }
2211 else
2212 {
2213 while (1)
2214 {
2215 if (p >= stop)
2216 {
2217 if (p >= endp)
2218 break;
2219 p = GAP_END_ADDR;
2220 stop = endp;
2221 }
2222 if (! fastmap[SYNTAX (*p)])
2223 break;
2224 p++, pos++, pos_byte++;
2225 UPDATE_SYNTAX_TABLE_FORWARD (pos);
2226 } 2205 }
2206 while (!parse_sexp_lookup_properties
2207 || pos < gl_state.e_property);
2208
2209 update_syntax_table_forward (pos + gl_state.offset,
2210 false, gl_state.object);
2227 } 2211 }
2228 } 2212 }
2229 else 2213 else
2230 { 2214 {
2215 p = BYTE_POS_ADDR (pos_byte);
2216 endp = CHAR_POS_ADDR (XINT (lim));
2217 stop = pos >= GPT && GPT > XINT (lim) ? GAP_END_ADDR : endp;
2218
2231 if (multibyte) 2219 if (multibyte)
2232 { 2220 {
2233 while (1) 2221 while (1)
@@ -2269,6 +2257,7 @@ skip_syntaxes (bool forwardp, Lisp_Object string, Lisp_Object lim)
2269 } 2257 }
2270 } 2258 }
2271 2259
2260 done:
2272 SET_PT_BOTH (pos, pos_byte); 2261 SET_PT_BOTH (pos, pos_byte);
2273 immediate_quit = 0; 2262 immediate_quit = 0;
2274 2263