Multiple glPushAttrib/glPopAttrib

I am having problem using glPushAttrib()/glPopAttrib(). Here is what I do:

glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
glViewport(0, 0, (GLsizei) 2 * 256, (GLsizei) 512);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) 2 * 256, 0.0, (GLdouble) 512);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTABLE_ARB, texId, 0);

glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
glViewport(0, 0, (GLsizei) 2 * 256, (GLsizei) 2 * 512);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) 2 * 256, 0.0, (GLdouble) 2 * 512);

/* Texture mapping */

glPopAttrib();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

At this stage I would expect the Attrib stack to be:-

glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
glViewport(0, 0, (GLsizei) 2 * 256, (GLsizei) 512);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) 2 * 256, 0.0, (GLdouble) 512);

but it’s not. This is what it returns (Observe the ‘512 / 2’):-

glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
glViewport(0, 0, (GLsizei) 2 * 256, (GLsizei) 512 / 2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble) 2 * 256, 0.0, (GLdouble) 512 / 2);

glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texId);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glEnable(GL_TEXTURE_RECTANGLE_ARB);

/* Texture Mapping */

glDisable(GL_TEXTURE_RECTANGLE_ARB);

glPopAttrib();

Seems like the attribute stack restoration has not been properly implemented in the drivers. If this is true, it’s a shame since it is OpenGL 1.1 feature.

Graphics card: NVIDIA QuadroFX 3400
Driver version: 77.56