Hi,
You're quite right, it's because you're using the IOC (Interrupt On Change), it'll trip the interrupt both when you push the button and when you release the button. (As well as on all the edges of the contact bounce). Also, when you're using IOC you need to remember to read the port (even if you're not using the value) in order to clear the mismatch condition.

I'd wire the button to GP2 and use the "normal" INT instead of IOC.

/Henrik.