bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#13743: 24.2.93; Segmentation fault when trying to [s]teal a file ope


From: Dmitry Gutov
Subject: bug#13743: 24.2.93; Segmentation fault when trying to [s]teal a file opened elsewhere
Date: Mon, 25 Feb 2013 09:52:24 +0400
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130215 Thunderbird/17.0.3

On 24.02.2013 19:50, Eli Zaretskii wrote:
Date: Sun, 24 Feb 2013 19:28:32 +0400
From: Dmitry Gutov <dgutov@yandex.ru>
CC: Stefan Monnier <monnier@iro.umontreal.ca>, 13743@debbugs.gnu.org

How 'bout moving the

     if (BUFFERP (object))
       modify_region (object, start, end);

earlier in the function.  Something like the patch below.

This will (falsely, AFAIU) tell us that the region is about to be
modified when we return at the point marked below:

I tried the patches, and both seem to work fine so far. If you could
explain the practical implications of the drawback in Stefan's patch
you're describing here, I'll try to test for that, too.

You need to simulate the situation which causes us to return here:

        /* If this interval already has the properties, we can
           skip it.  */
        if (interval_has_all_properties (properties, i))
        {
          ptrdiff_t got = (LENGTH (i) - (s - i->position));
          if (got >= len)
            RETURN_UNGCPRO (Qnil); <<<<<<<<<<<<<<<<<<<<<<<<<<<

This condition means that we find an interval which already has the
property we are trying to add, and that interval's length is at least
as large as the distance between START and END.

The simplest thing to try reproducing this would be to call
add-text-properties with the property that is already somewhere in the
buffer and with START and END that belong to the buffer region with
this property.  I hope this will show you what happens.

Thanks.

The manifestation of the problem will be that modify_region will be
called in this case, although we don't actually modify anything.  You
will probably see the "modified" indicator on the mode line, something
that shouldn't have happened.

That is indeed what happens.

OTOH, the existing behavior in this area is rather messy anyway:

a) If START equals to the beginning of the region with the same property, the buffer is marked modified anyway (even though nothing changes from the observer's point of view).

So, the trivial example of repeating an `add-text-properties' call with the same arguments in a previously unpropertized buffer will mark it as modified every time.

b) This probably has something to do with internal representation, but even having the same property span before START is not a safe bet:

1. Create a new file with a line of text in it, preferably without spaces, to see face changes easily
2. Save it, disable font-lock-mode.
3. Evaluate:

(add-text-properties 1 6 '(face font-lock-constant-face)) => modified
save
(add-text-properties 2 6 '(face font-lock-constant-face)) => unmodified
(add-text-properties 2 7 '(face font-lock-constant-face)) => modified
save
(add-text-properties 2 6 '(face font-lock-constant-face)) => unmodified
- optional step
(add-text-properties 2 7 '(face font-lock-constant-face)) => modified(!)
- even though 1 still has the same face
- you can save and repeat this step indefinitely





reply via email to

[Prev in Thread] Current Thread [Next in Thread]