Merge branch 'rs/maint-diff-fd-leak' into maint
authorJunio C Hamano <gitster@pobox.com>
Sun, 26 Dec 2010 19:18:39 +0000 (11:18 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 26 Dec 2010 19:18:39 +0000 (11:18 -0800)
* rs/maint-diff-fd-leak:
close file on error in read_mmfile()

1  2 
xdiff-interface.c
diff --combined xdiff-interface.c
index e1e054e4d982de30d8a9c8c4109c6d62448f62a9,b78f757193368e612bd2194a608736971ed5749b..164581f87f49935f0d1b1885420960a4d11dea56
@@@ -138,20 -138,19 +138,20 @@@ int xdi_diff(mmfile_t *mf1, mmfile_t *m
  
  int xdi_diff_outf(mmfile_t *mf1, mmfile_t *mf2,
                  xdiff_emit_consume_fn fn, void *consume_callback_data,
 -                xpparam_t const *xpp,
 -                xdemitconf_t const *xecfg, xdemitcb_t *xecb)
 +                xpparam_t const *xpp, xdemitconf_t const *xecfg)
  {
        int ret;
        struct xdiff_emit_state state;
 +      xdemitcb_t ecb;
  
        memset(&state, 0, sizeof(state));
        state.consume = fn;
        state.consume_callback_data = consume_callback_data;
 -      xecb->outf = xdiff_outf;
 -      xecb->priv = &state;
 +      memset(&ecb, 0, sizeof(ecb));
 +      ecb.outf = xdiff_outf;
 +      ecb.priv = &state;
        strbuf_init(&state.remainder, 0);
 -      ret = xdi_diff(mf1, mf2, xpp, xecfg, xecb);
 +      ret = xdi_diff(mf1, mf2, xpp, xecfg, &ecb);
        strbuf_release(&state.remainder);
        return ret;
  }
@@@ -212,30 -211,15 +212,32 @@@ int read_mmfile(mmfile_t *ptr, const ch
                return error("Could not open %s", filename);
        sz = xsize_t(st.st_size);
        ptr->ptr = xmalloc(sz ? sz : 1);
-       if (sz && fread(ptr->ptr, sz, 1, f) != 1)
+       if (sz && fread(ptr->ptr, sz, 1, f) != 1) {
+               fclose(f);
                return error("Could not read %s", filename);
+       }
        fclose(f);
        ptr->size = sz;
        return 0;
  }
  
 +void read_mmblob(mmfile_t *ptr, const unsigned char *sha1)
 +{
 +      unsigned long size;
 +      enum object_type type;
 +
 +      if (!hashcmp(sha1, null_sha1)) {
 +              ptr->ptr = xstrdup("");
 +              ptr->size = 0;
 +              return;
 +      }
 +
 +      ptr->ptr = read_sha1_file(sha1, &type, &size);
 +      if (!ptr->ptr || type != OBJ_BLOB)
 +              die("unable to read blob object %s", sha1_to_hex(sha1));
 +      ptr->size = size;
 +}
 +
  #define FIRST_FEW_BYTES 8000
  int buffer_is_binary(const char *ptr, unsigned long size)
  {
@@@ -286,8 -270,9 +288,8 @@@ static long ff_regexp(const char *line
        result = pmatch[i].rm_eo - pmatch[i].rm_so;
        if (result > buffer_size)
                result = buffer_size;
 -      else
 -              while (result > 0 && (isspace(line[result - 1])))
 -                      result--;
 +      while (result > 0 && (isspace(line[result - 1])))
 +              result--;
        memcpy(buffer, line, result);
   fail:
        free(line_buffer);