/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/branchbuilder.py

  • Committer: John Arbash Meinel
  • Date: 2009-12-14 15:52:24 UTC
  • mto: (4634.107.1 2.0)
  • mto: This revision was merged to the branch mainline in revision 4897.
  • Revision ID: john@arbash-meinel.com-20091214155224-6av92htxukvp69jk
Fix a rare segmentation fault in the groupcompress code.

When finding the location to insert an entry in the hash map,
we start by going to the next hash bucket, and walking backwards
to find the last empty entry.
The last entry in the hash table intentionally points to just
after the actual entry table, so that we have an 'upper bound'.
However, if the last actual bucket was full, this could cause
us to check to see if the 'sentinal' value pointed to NULL,
which isn't valid. If the memory allocator did not allocate
extra bytes after then end of the entry table, this would
access invalid memory and segfault.
The fix is to change the if check to evaluate whether the current
pointer is in the current bucket before we check to see whether
it is empty. (Note that the double check *should* be redundant.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
103
103
        finally:
104
104
            tree.unlock()
105
105
 
106
 
    def _do_commit(self, tree, message=None, message_callback=None, **kwargs):
 
106
    def _do_commit(self, tree, message=None, **kwargs):
107
107
        reporter = commit.NullCommitReporter()
108
 
        if message is None and message_callback is None:
 
108
        if message is None:
109
109
            message = u'commit %d' % (self._branch.revno() + 1,)
110
 
        return tree.commit(message, message_callback=message_callback,
 
110
        return tree.commit(message,
111
111
            reporter=reporter,
112
112
            **kwargs)
113
113
 
162
162
 
163
163
    def build_snapshot(self, revision_id, parent_ids, actions,
164
164
        message=None, timestamp=None, allow_leftmost_as_ghost=False,
165
 
        committer=None, timezone=None, message_callback=None):
 
165
        committer=None, timezone=None):
166
166
        """Build a commit, shaped in a specific way.
167
167
 
168
168
        :param revision_id: The handle for the new commit, can be None
175
175
            ('rename', ('orig-path', 'new-path'))
176
176
        :param message: An optional commit message, if not supplied, a default
177
177
            commit message will be written.
178
 
        :param message_callback: A message callback to use for the commit, as
179
 
            per mutabletree.commit.
180
178
        :param timestamp: If non-None, set the timestamp of the commit to this
181
179
            value.
182
180
        :param timezone: An optional timezone for timestamp.
246
244
            for file_id, content in new_contents.iteritems():
247
245
                tree.put_file_bytes_non_atomic(file_id, content)
248
246
            return self._do_commit(tree, message=message, rev_id=revision_id,
249
 
                timestamp=timestamp, timezone=timezone, committer=committer,
250
 
                message_callback=message_callback)
 
247
                timestamp=timestamp, timezone=timezone, committer=committer)
251
248
        finally:
252
249
            tree.unlock()
253
250