From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, "Johannes Sixt" <j.sixt@viscovery.net>,
"Jeff King" <peff@peff.net>,
"Torsten Bögershausen" <tboegi@web.de>,
"Eric Sunshine" <sunshine@sunshineco.com>,
"Michael Haggerty" <mhagger@alum.mit.edu>
Subject: [PATCH v3 24/25] resolve_symlink(): take a strbuf parameter
Date: Mon, 14 Apr 2014 15:54:54 +0200 [thread overview]
Message-ID: <1397483695-10888-25-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1397483695-10888-1-git-send-email-mhagger@alum.mit.edu>
Change resolve_symlink() to take a strbuf rather than a string as
parameter. This simplifies the code and removes an arbitrary pathname
length restriction. It also means that lock_file's filename field no
longer needs to be initialized to a large size.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
lockfile.c | 53 +++++++++++++++++++----------------------------------
1 file changed, 19 insertions(+), 34 deletions(-)
diff --git a/lockfile.c b/lockfile.c
index 59ed758..65f56ef 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -124,53 +124,40 @@ static char *last_path_elm(char *p)
#define MAXDEPTH 5
/*
- * p = path that may be a symlink
- * s = full size of p
+ * path contains a path that might be a symlink.
*
- * If p is a symlink, attempt to overwrite p with a path to the real
- * file or directory (which may or may not exist), following a chain of
- * symlinks if necessary. Otherwise, leave p unmodified.
+ * If path is a symlink, attempt to overwrite it with a path to the
+ * real file or directory (which may or may not exist), following a
+ * chain of symlinks if necessary. Otherwise, leave path unmodified.
*
- * This is a best-effort routine. If an error occurs, p will either be
- * left unmodified or will name a different symlink in a symlink chain
- * that started with p's initial contents.
- *
- * Always returns p.
+ * This is a best-effort routine. If an error occurs, path will
+ * either be left unmodified or will name a different symlink in a
+ * symlink chain that started with the original path.
*/
-
-static char *resolve_symlink(char *p, size_t s)
+static void resolve_symlink(struct strbuf *path)
{
int depth = MAXDEPTH;
static struct strbuf link = STRBUF_INIT;
while (depth--) {
- if (strbuf_readlink(&link, p, strlen(p)) < 0)
+ if (strbuf_readlink(&link, path->buf, path->len) < 0)
break;
- if (is_absolute_path(link.buf)) {
+ if (is_absolute_path(link.buf))
/* absolute path simply replaces p */
- if (link.len < s)
- strcpy(p, link.buf);
- else {
- warning("%s: symlink too long", p);
- break;
- }
- } else {
+ strbuf_reset(path);
+ else {
/*
* link is a relative path, so replace the
* last element of p with it.
*/
- char *r = (char *)last_path_elm(p);
- if (r - p + link.len < s)
- strcpy(r, link.buf);
- else {
- warning("%s: symlink too long", p);
- break;
- }
+ char *r = last_path_elm(path->buf);
+ strbuf_setlen(path, r - path->buf);
}
+
+ strbuf_addbuf(path, &link);
}
strbuf_reset(&link);
- return p;
}
static int lock_file(struct lock_file *lk, const char *path, int flags)
@@ -189,16 +176,14 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
lk->active = 0;
lk->owner = 0;
lk->on_list = 1;
- strbuf_init(&lk->filename, PATH_MAX);
+ strbuf_init(&lk->filename, 0);
lk->next = lock_file_list;
lock_file_list = lk;
}
strbuf_addstr(&lk->filename, path);
- if (!(flags & LOCK_NODEREF)) {
- resolve_symlink(lk->filename.buf, lk->filename.alloc);
- strbuf_setlen(&lk->filename, strlen(lk->filename.buf));
- }
+ if (!(flags & LOCK_NODEREF))
+ resolve_symlink(&lk->filename);
strbuf_addstr(&lk->filename, LOCK_SUFFIX);
lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
if (lk->fd < 0) {
--
1.9.1
next prev parent reply other threads:[~2014-04-14 13:56 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-14 13:54 [PATCH v3 00/25] Lockfile correctness and refactoring Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 01/25] unable_to_lock_die(): rename function from unable_to_lock_index_die() Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 02/25] api-lockfile: expand the documentation Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 03/25] rollback_lock_file(): do not clear filename redundantly Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 04/25] rollback_lock_file(): set fd to -1 Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 05/25] lockfile: unlock file if lockfile permissions cannot be adjusted Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 06/25] hold_lock_file_for_append(): release lock on errors Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 07/25] lock_file(): always add lock_file object to lock_file_list Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 08/25] lockfile.c: document the various states of lock_file objects Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 09/25] cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LEN Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 10/25] delete_ref_loose(): don't muck around in the lock_file's filename Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 11/25] prepare_index(): declare return value to be (const char *) Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 12/25] write_packed_entry_fn(): convert cb_data into a (const int *) Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 13/25] lock_file(): exit early if lockfile cannot be opened Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 14/25] remove_lock_file(): call rollback_lock_file() Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 15/25] commit_lock_file(): inline temporary variable Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 16/25] commit_lock_file(): die() if called for unlocked lockfile object Michael Haggerty
2014-04-15 6:49 ` Johannes Sixt
2014-04-16 15:17 ` Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 17/25] lockfile: avoid transitory invalid states Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 18/25] struct lock_file: declare some fields volatile Michael Haggerty
2014-04-15 6:55 ` Johannes Sixt
2014-04-16 15:36 ` Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 19/25] try_merge_strategy(): remove redundant lock_file allocation Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 20/25] try_merge_strategy(): use a statically-allocated lock_file object Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 21/25] commit_lock_file(): use a strbuf to manage temporary space Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 22/25] Change lock_file::filename into a strbuf Michael Haggerty
2014-04-14 13:54 ` [PATCH v3 23/25] resolve_symlink(): use a strbuf for internal scratch space Michael Haggerty
2014-04-14 13:54 ` Michael Haggerty [this message]
2014-04-14 13:54 ` [PATCH v3 25/25] trim_last_path_elm(): replace last_path_elm() Michael Haggerty
2014-04-15 18:40 ` [PATCH v3 00/25] Lockfile correctness and refactoring Torsten Bögershausen
2014-04-16 19:50 ` Michael Haggerty
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1397483695-10888-25-git-send-email-mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j.sixt@viscovery.net \
--cc=peff@peff.net \
--cc=sunshine@sunshineco.com \
--cc=tboegi@web.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).