public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Prasanna Meda <pmeda@akamai.com>
Cc: Andrew Morton <akpm@osdl.org>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: 2.6.10-mm3: lseek broken on /proc/self/maps
Date: Fri, 14 Jan 2005 13:23:39 -0800	[thread overview]
Message-ID: <1105737819.11209.9.camel@localhost> (raw)

[-- Attachment #1: Type: text/plain, Size: 1250 bytes --]

lseek doesn't seem to have any effect on /proc/<pid>/maps.  It should
either work as expected, or fail.

I've attached a test program which uses a doubling buffer policy to try
to read the whole buffer.  If it runs out of buffer, it simply allocates
a new one, lseeks back to the beginning of the buffer, and tries again.
However, the lseek seems to have no effect, because the next read
continues from where the previous one (before the lseek) left off.

Re-opening the file between each attempt works as expected.

$ tm &
$ ./readmap $!
b7dea000-b7deb000 r-xp b7dea000 00:00 0
b7deb000-b7dec000 ---p b7deb000 00:00 0
b7dec000-b7ded000 r-xp b7dec000 00:00 0
b7ded000-b7dee000 ---p b7ded000 00:00 0
b7dee000-b7def000 r-xp b7dee000 00:00 0
b7def000-b7df0000 ---p b7def000 00:00 0
b7df0000-b7df1000 r-xp b7df0000 00:00 0
[...]
$ gcc -o readmap -DREOPEN readmap.c
$ ./readmap $!
08048000-08049000 r-xp 00000000 03:07 3868140    /home/jeremy/tm
08049000-0804a000 rwxp 00000000 03:07 3868140    /home/jeremy/tm
b7ae6000-b7ae7000 r-xp b7ae6000 00:00 0
b7ae7000-b7ae8000 ---p b7ae7000 00:00 0
b7ae8000-b7ae9000 r-xp b7ae8000 00:00 0
b7ae9000-b7aea000 ---p b7ae9000 00:00 0
b7aea000-b7aeb000 r-xp b7aea000 00:00 0
b7aeb000-b7aec000 ---p b7aeb000 00:00 0

	J

[-- Attachment #2: readmap.c --]
[-- Type: text/x-csrc, Size: 1051 bytes --]

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#ifndef REOPEN
#define REOPEN	0
#endif

int main(int argc, char **argv)
{
	int bufsize = 1024;
	char *buf = NULL;
	int bufused;
	int got;
	int fd = -1;
	char path[100];

	if (argc <= 1)
		strcpy(path, "/proc/self/maps");
	else
		sprintf(path, "/proc/%s/maps", argv[1]);

  again:
	if (fd == -1)
		fd = open(path, O_RDONLY);

	if (fd == -1) {
		perror("open");
		exit(1);
	}

	if (lseek(fd, 0, SEEK_SET) == -1) {
		perror("lseek");
		exit(1);
	}
	bufused = 0;
	if (buf == NULL)
		buf = malloc(bufsize);

	do {
		int want = bufsize - bufused;
		got = read(fd, &buf[bufused],
			       want > 4000 ? 4000 : want); /* work around other bug */
		if (got < 0) {
			perror("read");
			exit(1);
		}
		bufused += got;
	} while(bufused < bufsize && got != 0);

	if (bufused == bufsize) {
		free(buf);
		buf = NULL;
		bufsize *= 2;
		if (REOPEN) {
			/* reopen */
			close(fd);
			fd = -1;
		}
		goto again;
	}
	close(fd);

	write(1, buf, bufused);

	return 0;
}

[-- Attachment #3: tm.c --]
[-- Type: text/x-csrc, Size: 257 bytes --]

#include <sys/mman.h>
#include <unistd.h>
int main()
{
	int i;
	char *m = mmap(0, 1000*4096, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
	char *p = m;

	for(i = 0; i < 1000; i+=2) {
		mprotect(p, 4096, PROT_READ);
		p += 8192;
	}

	pause();

	return 0;
}

             reply	other threads:[~2005-01-14 21:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-14 21:23 Jeremy Fitzhardinge [this message]
2005-01-15  0:46 ` 2.6.10-mm3: lseek broken on /proc/self/maps Prasanna Meda
2005-01-15  1:05   ` Jeremy Fitzhardinge

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=1105737819.11209.9.camel@localhost \
    --to=jeremy@goop.org \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pmeda@akamai.com \
    /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